欢迎关注WX公众号:【程序员管小亮】
声明
1)该文章整理自网上的大牛和机器学习专家无私奉献的资料,具体引用的资料请看参考文献。
2)本文仅供学术交流,非商用。因此每一部分具体的参考资料并无详细对应。若是某部分不当心侵犯了你们的利益,还望海涵,并联系博主删除。
3)博主才疏学浅,文中若有不当之处,请各位指出,共同进步,谢谢。
4)此属于初版本,如有错误,还需继续修正与增删。还望你们多多指点。你们都共享一点点,一块儿为祖国科研的推动添砖加瓦。html
深度学习入门笔记(二):神经网络基础
一、二分类
下面要学习的是神经网络的基础知识,其中须要注意的是,当实现一个神经网络的时候,须要知道一些很是重要的技术和技巧,闲言少叙,直接开搞。程序员
逻辑回归(logistic regression) 是一个用于 二分类(binary classification) 的算法。首先从一个问题——猫咪识别开始提及,若是识别这张图片为猫,则输出标签1做为结果;若是识别出不是猫,那么输出标签0做为结果。用字母
y 来表示输出的结果标签,以下图所示:
如上图所示,一张图片在计算机中对应三个矩阵,分别对应图片中的红、绿、蓝三种颜色通道,且图片大小与三个矩阵相同,分别对应图片中红、绿、蓝三种像素的强度值。web
为了把这些像素值转换为 特征向量
x,须要定义特征向量表示图片,把像素都取出来,也就是矩阵中的数据,例如25五、231等等,取完红色像素接着是绿色像素,最后是蓝色像素,直到获得特征向量,也就是图片中红、绿、蓝像素排列的值。若是图片的大小为64x64像素,那么
x 的总维度,是64 * 64 * 3
,也便是三个像素矩阵中的像素总量(12288)。算法
如今用
nx=12288 来表示输入特征向量的维度,有时为了简洁,直接用小写的
n 来表示。因此二分类问题中,最终的目标就是习得一个分类器,以图片特征向量做输入,预测输出结果
y 是1仍是0,即预测图片中是否有猫。编程
符号定义 :网络
x:表示一个
nx 维数据,为输入数据,维度为
(nx,1);app
y:表示输出结果,取值为
(0,1);框架
(x(i),y(i)):表示第
i 组数据,多是训练数据,也多是测试数据,此处默认为训练数据;机器学习
X=[x(1),x(2),...,x(m)]:表示全部的训练数据集的输入值,放在一个
nx×m 的矩阵中,其中
m 表示样本数目;svg
Y=[y(1),y(2),...,y(m)]:对应表示全部训练数据集的输出值,维度为
1×m。
二、逻辑回归
对于二元分类问题,给定输入特征向量
X,它可能对应一张图片,若是想识别这张图片是不是猫的图片,怎么作?
定义算法的输出预测为
y^,也就是对实际值
y 的估计。更正式地来讲,
y^ 表示
y 等于1的一种可能性或者是概率,固然,前提条件是给定了输入特征
X。
上面说过
X 是一个
nx 维的向量,至关于有
nx 个特征的特征向量。
w 表示逻辑回归的参数,也是一个
nx 维向量,由于
w 其实是 特征权重,维度与特征向量相同。参数里面还有
b,是一个实数,表示误差。因此给出输入以及参数后,一个能够尝试却不可行的结果是
y^=wTx+b。
为何说能够尝试,却不可行呢?注意,这时获得的其实是线性回归时用到的一个关于输入
x 的线性函数,但这对二元分类问题来说,却不是一个很是好的算法。由于
y^ 表示实际值
y 等于1的概率,也就是说
y^ 应该在0到1之间。
这是一个须要解决的问题,由于
wTx+b 可能比1要大得多,更有甚者,多是一个负值,可是咱们想要的是一个几率。所以,在逻辑回归中,输出是
y^ 做为自变量的 sigmoid 函数的输出值。有点绕,其实简单来讲,
y^=sigmoid(y)。
如上图所示,就是 sigmoid 函数的图像,它平滑地从0走向1,这里的做用其实仍是把线性函数转换为非线性函数。
关于 sigmoid 函数的公式是这样的
σ(z)=1+e−z1
这里要注意的是,从图像能够看出两点:
- 若是
z 很是大,那么
e−z 将会接近于0,
σ(z) 会很是接近1。
- 相反地,若是
z 很是小或者一个绝对值很大的负数,那么
e−z 会变得很大,
σ(z) 就接近于0。
所以当实现逻辑回归时,
y^ 在0到1之间,成为对
y=1 几率的一个很好的估计。
三、逻辑回归的代价函数
为何须要代价函数(也翻译做成本函数)?
为了训练逻辑回归模型,获得参数
w和参数
b。
看到这里你可能有点蒙逼,先来看一下损失函数吧,你可能会问那 什么是损失函数? 损失函数又叫作 偏差函数,用来衡量算法的运行状况,Loss function:
L(y^,y).。经过这个
L,也就是损失函数,来衡量预测输出值和实际值有多接近。
通常的损失函数有预测值和实际值的平方差或者它们平方差的一半,可是一般在逻辑回归中不这么作,为何?由于在学习逻辑回归参数时,会发现优化目标不是 凸优化(在凸优化中局部最优值一定是全局最优值),只能找到多个局部最优值,极可能找不到全局最优值。因此虽然平方差是一个不错的损失函数,但在逻辑回归模型中定义的是另一个损失函数,即
L(y^,y)=−ylog(y^)−(1−y)log(1−y^)
为何要用这个函数做为逻辑损失函数?来举两个例子你就懂了,首先肯定一件事,不管解决什么问题,你确定想要偏差尽量地小。好了,如今来看例子吧:
-
当
y=1 时损失函数
L=−log(y^),若是想要损失函数
L 尽量得小,那么
y^ 就要尽量大,由于 sigmoid 函数取值
[0,1],因此
y^ 会无限接近于1。
-
当
y=0 时损失函数
L=−log(1−y^),若是想要损失函数
L 尽量得小,那么
y^ 就要尽量小,由于 sigmoid 函数取值
[0,1],因此
y^ 会无限接近于0。
而在逻辑回归中,咱们期待的输出就是1或者0,是否是这个损失函数更好呢? 😃
能够看出来,损失函数是在单个训练样本中定义的,它衡量的是算法在单个训练样本中表现如何。那么怎么衡量算法在所有训练样本上的表现如何?
须要定义一个算法的 代价函数,算法的代价函数,是对
m 个样本的损失函数求和,而后除以
m:
J(w,b)=m1i=1∑mL(y^(i),y(i))=m1i=1∑m(−y(i)logy^(i)−(1−y(i))log(1−y^(i)))
在训练逻辑回归模型时,找到合适的
w 和
b,来让代价函数
J 的总代价降到最低即为所求。
四、梯度降低法
梯度降低法能够作什么?
在测试集上,经过最小化 代价函数(成本函数)
J(w,b) 来训练的参数
w 和
b。
梯度降低法的形象化说明
在这个图中,横轴表示空间参数
w 和
b,代价函数(成本函数)
J(w,b) 是曲面,所以曲面高度就是
J(w,b) 在某一点的函数值。
而深度学习的最终目标就是找到代价函数(成本函数)
J(w,b) 函数值为最小值时对应的参数
w 和
b。梯度降低 能够分为三个步骤:
1. 随机初始化两个参数
以如图小红点的坐标来初始化参数
w 和
b。
开始寻找代价函数(成本函数)
J(w,b) 函数值的最小值。
2. 朝最陡的下坡方向走一步,不断地迭代
朝最陡的下坡方向走一步,如图,走到了如图中第二个小红点处。
可能停在这里,也有可能继续朝最陡的下坡方向再走一步,如图,通过两次迭代走到第三个小红点处。
3.直到走到全局最优解或者接近全局最优解的地方
经过重复以上的步骤,能够找到全局最优解,也就是代价函数(成本函数)
J(w,b) 这个凸函数的最小值点。
梯度降低法的细节化说明
逻辑回归的代价函数(成本函数)
J(w,b) 是含有两个参数的。
简要说明一下式子中的符号,
∂ 表示求偏导符号,能够读做 round;
∂w∂J(w,b) 就是函数
J(w,b) 对
w 求偏导,在代码中为
dw;
∂b∂J(w,b) 就是函数
J(w,b)对
b 求偏导,在代码中为
db。
其实不管是
d 仍是
∂ 都是求导数的意思,那么两者的区别是什么呢?
-
d 用在 求导数(derivative),即函数只有一个参数
-
∂ 用在 求偏导(partial derivative),即函数含有两个以上的参数
梯度降低法的具体化说明
梯度降低是如何进行的呢?这里任选一参数
w 进行举例:假定代价函数(成本函数)
J(w) 只有一个参数
w,即用一维曲线代替多维曲线,这样能够更好画出以下图像。
迭代就是不断重复作如图的公式:
其中,:=
表示更新参数;
a 表示 学习率(learning rate),用来控制 步长(step);
dwdJ(w) 就是函数
J(w) 对
w 求导(derivative),在代码中为
dw。对于导数更加形象化的理解就是 斜率(slope)。
如图该点的导数就是这个点相切于
J(w) 的小三角形的高除宽(这是高中数学学过的,不会的去百度——导数)。假设初始化如图点为起始点,该点处的斜率的符号是正,即
dwdJ(w)>0,因此接下来会向左走一步(假设该点处的斜率的符号是负的,则会向右走一步),如图:
不断地向左走,直至逼近最小值点,这就是梯度降低法的迭代过程。
五、逻辑回归的梯度降低
逻辑回归的梯度降低算法,关键点是几个重要公式,虽然使用计算图来计算逻辑回归的梯度降低算法有点大材小用了,具体什么是导数,什么是计算图,能够看这个博客——深度学习入门笔记(三):数学基础之求导数。
下面来完完整整地进行这个梯度降低算法的过程演示,相信我,跟着你就能全懂了。
假设,单个样本样本只有两个特征
x1 和
x2,为了计算
z,须要输入参数
w1、
w2 和
b。
所以
z=w1x1+w2x2+b。
回想一下逻辑回归的公式定义以下:
y^=a=σ(z),其中
z=wTx+b、
σ(z)=1+e−z1。
损失函数
L(y^(i),y(i))=−y(i)logy^(i)−(1−y(i))log(1−y^(i))。
代价函数
J(w,b)=m1∑imL(y^(i),y(i))。
若只考虑单个样本,代价函数变为
L(a,y)=−(ylog(a)+(1−y)log(1−a))。
梯度降低法中
w 和
b 的修正表达为
w:=w−a∂w∂J(w,b),
b:=b−a∂b∂J(w,b)。
如今画出表示这个计算过程的计算图,以下:
有了计算图,就不须要再写出公式了,只需修改参数
w 和
b。前面已经讲解了前向传播,如今来讲一下反向传播。
想要计算出代价函数
L(a,y) 的导数,可使用链式法则。
首先计算出
L(a,y) 关于
a 的导数。经过计算能够得出
dadL(a,y)=−y/a+(1−y)/(1−a)
而
dzda=a⋅(1−a)
所以将这两项相乘,获得:
dz=dzdL(a,y)=dzdL=(dadL)⋅(dzda)=(−ay+(1−a)(1−y))⋅a(1−a)=a−y
确定会有小伙伴说本身不太会微积分,不知道链式法则。Don‘t worry!!!只需知道
dz=(a−y) 已经计算好了,拿来主义,直接拿过来用就能够了。
最后一步反向推导,也就是计算
w 和
b 变化对代价函数
L 的影响
dw1=x1⋅dz
dw2=x2⋅dz
db=dz
而后更新
w1=w1−adw1
w2=w2−adw2
b=b−αdb
这就是单个样本实例的梯度降低算法中参数更新一次的步骤,深度学习的过程能够简单理解为重复迭代优化的过程(确定不许确,就是为了先理解一下而已)。吴恩达老师画的图,直观的体现了整个过程:
六、m 个样本的梯度降低
咱们想要的,确定不是单个样本,而是在
m 个训练样本上,也就是训练集上。
首先,关于算法的带求和的全局代价函数
J(w,b) 的定义以下:
J(w,b)=m1i=1∑mL(a(i),y(i))
其实是1到
m 项各个损失的平均,因此对
w1 的微分,对
w1 的微分,也一样是各项损失对
w1 微分的平均。
吴恩达老师手写稿以下:
而代价函数对权重向量
θ 求导过程以下,损失函数为交叉熵损失函数,整个过程以下:
经过 向量化 就能够获得
所以更新公式为:
推荐阅读
参考文章