神经网络和深度学习WU Week2

神经网络基础

1. 二分分类

  • 例子:识别图片中是否有猫,有输出1否则输出0。

  • 计算机储存图片通过RGB,即用三个矩阵分别储存red、green和blue的像素值,以常见64*64为例,从而用一个64*64*3的矩阵储存一张图片。

    计算机对图片的储存

    如何用一个特征向量 x(列向量)来表示这个像素矩阵?按照视频中的说明,先读取red矩阵的像素,逐行读取,以上图为例,读为[\color {red}{255,231,42,22,123,94,...,194,202}]^T,接着读取green矩阵的像素,仍是逐行读取,从而矩阵为 [\color {red} {255,231,42,22,123,94,...,194,202},\color {green}{255,134,202,22,...,94}]^T,最后读取blue矩阵的像素,所以整个图片存储为一个列向量[\color {red}{255,231,42,22,123,94,...,194,202},\color {green}{255,134,202,22,...,94}, \color {blue}{255,134,93,22,...,142}]^T
    即表示成如下:
    图片的储存矩阵

  • 符号约定
    (x,y):一个样本,x \in R^{n_x}为输入,y \in \{0,1\}为输出。
    m个训练样本: {(x^{(1)},y^{(1)}),(x^{(2)},y^{(2)}),...(x^{(m)},y^{(m)})}
    训练集的样本数: m_{train}m
    测试集的样本数:m_{test}
    矩阵X:每一列是一个样本,从而是n_x \times m维的。

    样本的矩阵表示

    • 对应python命令X.shape输出X的维数n_x \times m

    同样的,输出y也表示为一个1\times m维向量(y^{(1)},y^{(2)},...y^{(m)})。python命令Y.shape会输出1\times m

2. Logistic回归

  • \hat{y}:对输出y的预测值,在二分类问题中就是y取1的概率P(y=1|x)
  • 参数:w \in R^{n_x}b \in R
  • 给出输入变量x和参数w,b,如何得到预测值\hat{y}?
    线性回归是\hat{y}=w^T *x+b,但并不是一个很好的二分分类方法,因为我们希望\hat{y}是个介于0和1之间的数以表示概率,而w^T *x+b可以取任何值甚至是负数,为克服这个困难将输出做一个sigmoid函数变换\hat{y}=\sigma(w^T *x+b),其中sigmoid函数为\sigma(z)= \frac{1}{1+e^{-z}},其函数图像为
    sigmoid函数图像

    可以看到:
    • z取相当大的数时,e^{-z}趋向于0,从而\sigma(z)趋向于1
    • 而当z取相当大的负数时,e^{-z}趋向于+\infty,从而\sigma(z)趋向于0
    • z=0时,\sigma(z)=\frac{1}{2}
      所以\sigma(z)取值位于0和1之间。

3. Logistic 回归——cost function(成本函数/代价函数)

  • 为了训练wb需要定义cost function,用来衡量算法效果。
  • 回顾:Logistic回归
    \hat{y}=\sigma(w^T*x+b),其中\sigma(z)=\frac{1}{1+e^{-z}},给定训练集\{(x^{(1)},y^{(1)}),(x^{(2)},y^{(2)}),...(x^{(m)},y^{(m)})\},希望有\hat{y} :=(\hat{y}^{(1)},\hat{y}^{(2)},...\hat{y}^{(m)}) \approx y:=(y^{(1)},y^{(2)},...y^{(m)})
  • 先定义针对单个样本的Loss (Error) Function L(\hat{y},y):度量预测值\hat{y}与实际值y之间有多接近。
    • 例如,可以定义L(\hat{y},y)=\frac{1}{2}(y-\hat{y})^2,事实上并不这样应用,因为这样会导致函数非凸从而有多个局部最优解,所以使用梯度下降法时无法找到最优解(\color{red}{不太明白这句话,因为二次函数本来就是凸函数啊})。
    • 在Logistic回归中会定义一个凸的损失函数:
      L(\hat{y},y)=-[ylog(\hat{y})+(1-y)log(1-\hat{y})]
      • y=1,则L(\hat{y},y)=-log(\hat{y}),让损失函数尽可能小,从而log(\hat{y})尽可能大,从而\hat{y}尽可能大,而\hat{y}是sigmoid函数的输出,最大就是1,所以此时是要让\hat{y}=1;
      • y=0,则L(\hat{y},y)=-log(1-\hat{y}),让损失函数尽可能小,从而log(1-\hat{y})尽可能大,从而1-\hat{y}尽可能大,即\hat{y}尽可能小,而\hat{y}是sigmoid函数的输出,最小就是0,所以此时是要让\hat{y}=0
  • cost function(成本函数):度量在训练集上的整体表现。
    J(w,b)=\frac{1}{m}\sum\limits_{i=1}^mL(\hat{y},y)=-\frac{1}{m}\sum\limits_{i=1}^m[y^{(i)}log(\hat{y}^{(i)})+(1-y^{(i)})log(1-\hat{y}^{(i)})]
  • 注:\color{red}{Loss funciton:单个样本;} \color{red}{Cost function: 训练集上所有样本的整体表现。}

4.梯度下降法

  • 用来训练或学习训练集上的参数w,b

  • 回顾:
    J(w,b)=\frac{1}{m}\sum\limits_{i=1}^mL(\hat{y},y)=-\frac{1}{m}\sum\limits_{i=1}^m[y^{(i)}log(\hat{y}^{(i)})+(1-y^{(i)})log(1-\hat{y}^{(i)})]

  • 梯度下降法就是给定初始的(w,b),找到当前下降最快的方向走一步,再找当前下降最快的方向走一步,一直到找到最优解为止,因为我们上面定义的Loss Function是凸函数,所以肯定能找到全局最优解。如下图所示。

    梯度下降法示意图

    • Logistic回归基本上任意初始化方法都好用,一般初始化为0。
  • 其具体过程为,针对参数w,迭代为w:=w-\alpha\frac{\partial L(w,b)}{\partial w}

    • 其中\alpha是学习率,可以控制每次迭代或者说梯度下降法中的步长。
    • 编程时就用\mathrm{d}w表示对w的偏导数。
    • J(w,b)是凸函数,因此,若\mathrm{d} w >0w迭代后向着减小的方向步进,图上来看就是向左迭代;若\mathrm{d} w <0w迭代后向着增大的方向步进,图上来看就是向右迭代,无论哪种情况,都会找到全局最优解,如下图所示。
      w迭代示意图
  • 类似的,b的迭代为:b:=b-\alpha\frac{\partial L(w,b)}{\partial b}

5.计算图(前向传播)及其导数计算(后向传播)

5.1 计算图

  • 计算图感觉像高数里的函数复合过程用图表示出来。
  • toy example
    J(a,b,c) = 3(a+bc),其复合与计算过程如下图
    toy example的复合和计算过程

5.2 计算图的导数计算

从右向左推导出复合函数的链式求导法则。


复合函数的链式求导法则示例

6.Logistic回归中的梯度下降

6.1 单个样本的情况

  • 回顾Logistic回归
    • 公式:
      \begin{array}{l}{z=w^{T} x+b} \\ {\hat{y}=a=\sigma(z)} \\ {L(a, y)=-(y \log (a)+(1-y) \log (1-a))}\end{array}
    • 计算步骤(前向,计算loss function):
      假设有两个特征(x_1,x_2)^T,从而所需参数为w_1,w_2,b
      • Step1:计算z = w_1 *x_1+w_2*x_2+b;
      • Step2:计算\hat{y} = a = \sigma(z),其中\sigma()是sigmoid函数\sigma(z)=\frac{1}{1+e^{-z}};
      • Step3:计算loss function:L(a,y)=-[ylog(a)+(1-y)log(1-a)]
        即输入参数w_1,w_2,b计算损失函数最小。如图所示。
        单个样本的logistic流程图
    • 计算步骤(后向,计算偏导数)
      • Step1:\mathrm{d}a=\frac{\partial L(a,y)}{\partial a}=-\frac{y}{a}+\frac{1-y}{1-a}
      • Step2:\frac{\mathrm{d}a}{\mathrm{d}z}=\frac{e^{-z}}{[1+e^{(-z)}]^2}=\frac{1}{1+e^{-z}} \bullet \frac{e^{-z}}{1+e^{-z}}=a(1-a)。所以有
        \mathrm{d}z = \frac{\partial L(a,y)}{\partial z}=\frac{\partial L(a,y)}{\partial a} \bullet \frac{\mathrm{d}a}{\mathrm{d}z}
        =(-\frac{y}{a}+\frac{1-y}{1-a})a(1-a)=(a-1)y+a(1-y)
        =a-y
      • Step3. \mathrm{d}w_1 = \frac{\partial L(a,y)}{\partial a} \bullet \frac{\mathrm{d}a}{\mathrm{d}z} \bullet \frac{\partial z}{\partial w_1} = x_1(a-y)
        \mathrm{d}w_2 = \frac{\partial L(a,y)}{\partial a} \bullet \frac{\mathrm{d}a}{\mathrm{d}z} \bullet \frac{\partial z}{\partial w_2} = x_2(a-y)
        \mathrm{d}b = \frac{\partial L(a,y)}{\partial a} \bullet \frac{\mathrm{d}a}{\mathrm{d}z} \bullet \frac{\partial z}{\partial b} = (a-y)
      • Step4.迭代公式:
        w_1 = w_1 -\alpha\mathrm{d}w_1
        w_2 = w_2 -\alpha\mathrm{d}w_2
        b = b -\alpha\mathrm{d}b

6.2 m个样本的训练集

  • 回顾:
    J(w,b)=\frac{1}{m}\sum\limits_{i=1}^mL(a^{(i)},y^{(i)})=-\frac{1}{m}\sum\limits_{i=1}^m[y^{(i)}log(a^{(i)})+(1-y^{(i)})log(1-a^{(i)})]
    其中
    a^{(i)} = \hat{y}^{(i)} = \sigma(z^{(i)})=\sigma(w^Tx^{(i)}+b)
  • 计算偏导数
    \mathrm{d}w_1 =\frac{\partial J(w,b)}{\partial w_1}=\frac{1}{m}\sum\limits_{i=1}^m\mathrm{d}w_1^{(i)}=\frac{1}{m}\sum\limits_{i=1}^mx_1^{(i)}(a^{(i)}-y^{(i)})
    \mathrm{d}w_2 =\frac{\partial J(w,b)}{\partial w_2}=\frac{1}{m}\sum\limits_{i=1}^m\mathrm{d}w_2^{(i)}=\frac{1}{m}\sum\limits_{i=1}^mx_2^{(i)}(a^{(i)}-y^{(i)})
    \mathrm{d}b=\frac{\partial J(w,b)}{\partial b}=\frac{1}{m}\sum\limits_{i=1}^m\mathrm{d}b^{(i)}=\frac{1}{m}\sum\limits_{i=1}^m(a^{(i)}-y^{(i)})
  • 伪代码流程
# w,b一次迭代的流程
dw_1=0,dw_2=0,db=0,J=0
for i in range(m):   #m个样本
    z(i) = w^T*x(i)+b
    a(i) = \sigma(z(i))
    J+=-[y(i)log(a(i))+(1-y(i))log(1-a(i))]  
    dz(i) = a(i)-y(i)
    dw_1 += x_1(i)[a(i)-y(i)]
    dw_2 += x_2(i)[a(i)-y(i)]  #假设有2个特征,即n=n_x=2
    db += a(i)-y(i)
J/=m
dw_1/=m,dw_2/=m,db/=m
w_1 -=\alpha * dw_1
w_2 -=\alpha * dw_2
b -=\alpha * db
  • 说明:
    • 该流程有2个for循环,第一个是遍历m个样本点,第二个是遍历2个特征。
    • 深度学习中有大量的数据,所以尽量避免使用显式的for循环,从而引出vectorization。

7.Vectorizaion(向量化)

7.1 向量化

  • 只要有其他可能,就不要用显式for循环
    Whenever possible, avoid explicit for-loops。
  • numpy模块的内置函数
np.exp()
np.log()
np.abs()
  • 利用向量化,前面的程序可以修改为
import numpy as np
# w,b一次迭代的流程
dw=np.zeros((n_x,1)),db=0,J=0
for i in range(m):   #m个样本
    z(i) = w^T*x(i)+b
    a(i) = \sigma(z(i))
    J+=-[y(i)log(a(i))+(1-y(i))log(1-a(i))]  
    dz(i) = a(i)-y(i)
    dw += x(i)[a(i)-y(i)]
    db += a(i)-y(i)
J/=m
dw /=m, db/=m
w_1 -=\alpha * dw_1
w_2 -=\alpha * dw_2
b -=\alpha * db

7.2 向量化Logistic回归

  • 回顾:m个样本的训练集
    z^{(1)}=w^T*x^{(1)}+b,a^{(1)}=\sigma(z^{(1)})
    z^{(2)}=w^T*x^{(2)}+b,a^{(2)}=\sigma(z^{(2)})
    ………
    z^{(m)}=w^T*x^{(m)}+b,a^{(m)}=\sigma(z^{(m)})
    X=[x^{(1)},x^{(2)},…,x^{(m)}],既每一列是一个样本,矩阵维数为n_x \times mz=[z^{(1)},z^{(2)},…,z^{(m)}]1\times m的行向量。从而上式可写为z=w^T *X+[b,b,…,b]。A=[a{(1)},a{(2)},…,a{(m)}]。
z=np.dot(w.T,X)+b
a=\sigma(z)

7.3 向量化Logistic回归的梯度计算

  • 回顾公式:
    \mathrm{d}w_1 =\frac{\partial J(w,b)}{\partial w_1}=\frac{1}{m}\sum\limits_{i=1}^m\mathrm{d}w_1^{(i)}=\frac{1}{m}\sum\limits_{i=1}^mx_1^{(i)}(a^{(i)}-y^{(i)})
    \mathrm{d}w_2 =\frac{\partial J(w,b)}{\partial w_2}=\frac{1}{m}\sum\limits_{i=1}^m\mathrm{d}w_2^{(i)}=\frac{1}{m}\sum\limits_{i=1}^mx_2^{(i)}(a^{(i)}-y^{(i)})
    \mathrm{d}b=\frac{\partial J(w,b)}{\partial b}=\frac{1}{m}\sum\limits_{i=1}^m\mathrm{d}b^{(i)}=\frac{1}{m}\sum\limits_{i=1}^m(a^{(i)}-y^{(i)})
  • 向量化
    A=[a^{(1)},a^{(2)},...,a^{(m)}]
    Y=[y^{(1)},y^{(2)},...,y^{(m)}]
    所以, \mathrm{d}z=A-Y.
    \mathrm{d}b = \frac{1}{m}\sum\limits_{i=1}^m(a^{(i)}-y^{(i)}) =np.sum(A-Y)
    \mathrm{d}w = \frac{1}{m}Xdz^T
    =\frac{1}{m}[x^{(1)},x^{(2)},...,x^{(m)}][\mathrm{d}z^{(1)},\mathrm{d}z^{(2)},...,\mathrm{d}z^{(m)}]^T
    =\frac{1}{m}(x^{(1)}\mathrm{d}z^{(1)}+x^{(2)}\mathrm{d}z^{(2)}+...+x^{(m)}\mathrm{d}z^{(m)})
  • Logistic回归的向量化伪代码
z = w^T*X + b = np.dot(w^T,X) + b
a = \sigma(z)
dz = A - Y
dw = 1/m*X*dz^T db = 1/m*np.sum(dz)
dw /=m, db/=m
w := w - \alpha * dw
b = b - \alpha * db

8. Python 中的Broadcasting

8.1 Broadcasting

Broadcasting是计算中对维数要求没有那么严格,可以自己调整维度以适应计算。

  • 例子


    示意矩阵

    问题:计算每种食物中各成分的占比

import numpy as np
A = np.array([[56,0,4.4,68],
             [1.2,104,52,8],
             [1.8,135,99,0.9]])
cal = A.sum(axis=0)
percentage = A/cal.reshape(1,4)
print(100 * percentage)

Broadcasting维度不必严格要求,但是行或列必须有一个是相同的,python才能自己复制成合适维度的矩阵进行计算。

  • MATLAB中类似的是bsxfun函数。

8.2 编程小技巧

*尽量不要使用秩为1的数组

a = np.random.randn(5)

使用有明确维度的矩阵

a = np.random.randn(5,1)

可以使用reshape()来改变矩阵的维度

a.reshape(1,5)

可以使用assert()来声明你希望的矩阵维度

assert(a.shape == (1,5))
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 228,119评论 6 531
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 98,382评论 3 415
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 176,038评论 0 373
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 62,853评论 1 309
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 71,616评论 6 408
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 55,112评论 1 323
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 43,192评论 3 441
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 42,355评论 0 288
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 48,869评论 1 334
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 40,727评论 3 354
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 42,928评论 1 369
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 38,467评论 5 358
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 44,165评论 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 34,570评论 0 26
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 35,813评论 1 282
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 51,585评论 3 390
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 47,892评论 2 372