梯度更新
举例说明
对于逻辑归回梯度求解:
假设预测输出函数:
h(x0,x1,...,xn)=∑i=0nθixi+θ0 h ( x 0 , x 1 , . . . , x n ) = ∑ i = 0 n θ i x i + θ 0i:一次输入中,第
i
个数据实际输出: y y
Cost Function函数:
j:第
j
个输入,总共输入m个数据梯度求解的最终目的:令 J J 的值 最小,根据微积分,只要求出
根据导数的定义: J=J−J′ J = J − J ′ , J J 肯定是往函数最小值方向移动,即
但是通常情况下,由于 J J 很难直接求解出来,换个思路就是通过更新参数来实现: J′→0或J→min J ′ → 0 或 J → min
如何保证参数 θi θ i 更新方向是 J→min J → min ?
求解:
θ+i=θi−Δθi θ i + = θ i − Δ θ i根据导数定义,如果保证 Δθi Δ θ i 和偏导数 ∂J∂θi ∂ J ∂ θ i 数值正负号一致,上述参数 θi θ i 更新后, J→min J → min如何确定每次参数要更新多少?
对于参数更新公式:
θ+i=θi−Δθi θ i + = θ i − Δ θ i只是保证了参数更新方向正确,为了防止一步跨度太大,最终 J J 的值一下子垮过min,从而造成抖动,需要引入学习效率,最终公式:θ+i=θi−ηΔθi θ i + = θ i − η Δ θ i一般: η∈[0,1] η ∈ [ 0 , 1 ]
小结:
θ+i=θi−ηΔθi θ i + = θ i − η Δ θ i该公式属于人造并非数学推导,主要是符合了参数更新方向、同时人为设定更新步长
PS:某个权重更新的值=0,即 ∂J∂θi=0 ∂ J ∂ θ i = 0 ,并不代表 dJdθ=0 d J d θ = 0
常见梯度更新方法
BGD
批次梯度下降
- 概念:每次更新所有样本数据来更新一次 J(θ) J ( θ ) 的参数 θ θ
- 预测函数:
h(x0,x1,...,xn)=∑i=0nθixi+θ0 h ( x 0 , x 1 , . . . , x n ) = ∑ i = 0 n θ i x i + θ 0
- 对于cost function:
J(θ0,θ1,...,θn)=1m∑j=0m(y(j)−h(j))2 J ( θ 0 , θ 1 , . . . , θ n ) = 1 m ∑ j = 0 m ( y ( j ) − h ( j ) ) 2
- 有参数更新公式:
θ+i=θi−η∂J∂θi=θi−η2m∑j=0m(y(j)−h(j))xi θ i + = θ i − η ∂ J ∂ θ i = θ i − η 2 m ∑ j = 0 m ( y ( j ) − h ( j ) ) x i
- 这种参数更新方法是批量梯度更新,也就是每次更新 θi θ i 都需要用到这样本里所有数据
- 小结:
- 优点:没更新一次,都用所有样本数据进行更新,这样就求解了全局最优解,同时通过计算公式可以发现可以并行实现;
- 缺点:由于每次更新都要计算该批次训练样本数据,如果批次样本数量太大,训练过程会很慢
SGD
随机梯度下降
概念:由于BGD每次更新都需要用到批次里所有样本数据,所以引入随机梯度下降概念;和BGD的区别在于,每次训练样本只输入一个,通过不断输入不同样本来修正参数,而BGD是一次输入所有样本来修正参数
区别 BGD SGD h(x) h ( x ) ∑ni=0θixi+θ0 ∑ i = 0 n θ i x i + θ 0 ∑ni=0θixi+θ0 ∑ i = 0 n θ i x i + θ 0 J(θ) J ( θ ) 1m∑mj=0(y(j)−h(j))2 1 m ∑ j = 0 m ( y ( j ) − h ( j ) ) 2 12(y−h)2 1 2 ( y − h ) 2 每次输入样本数 所有 1个 循环次数 一次 =样本数量 小结:
- 优点:训练速度快;
- 缺点:准确度下降(噪音比BGD大),并非全局最优解;不易于并行实现;
MBGD
小批量梯度下降
概念:结合了BGD和SGD的优点:将所有的样本分割成很多小份,每次用这个小样本进行BGD训练,即:
for SGD: for BGD: ...
- 小结:
- 目前算法比较常用的梯度下降算法用MBGD,常用的小份样本数量有:64、10
常用梯度更新公式推导
神经网络常用梯度更新公式推导
Pooling
- 在池化层,设置了固定的w,所以参数不在此更新
- 主要类似设置了反向传播的阀门,保证反向阀门开合以及打开大小
- 这里的pooling方法是一般池化,即池化过程中,各个模块的边界不重叠。除了不重叠方法外,还有重叠池化、空金字塔池化
Max Pooling
概念:反向传播求导数过程类似分段函数求导
分段函数在分段点的导数必须分别求左右导数,而在非分段点的导数如常
有矩阵如下:
147258369 1 2 3 4 5 6 7 8 9求解整个矩阵的max_pooling,则:
y=max(x1,x2,...,x9)=9 y = max ( x 1 , x 2 , . . . , x 9 ) = 9反向传播时:
∂y∂xn={0,xn非最大值1,xn是最大值 ∂ y ∂ x n = { 0 , x n 非 最 大 值 1 , x n 是 最 大 值这个公式可以通过如下代码的条件语句实现:
if x_n == y: y_d = 1 else: y_d = 0
根据反向传播公式的链式原理:
w+=w−ηΔw=w−η∂J∂w|x=x0=w−η∂J∂Out1∂Out1∂Net1...∂Neti∂w|x=x0 w + = w − η Δ w = w − η ∂ J ∂ w | x = x 0 = w − η ∂ J ∂ O u t 1 ∂ O u t 1 ∂ N e t 1 . . . ∂ N e t i ∂ w | x = x 0如果pooling层对 xi x i 偏导数为0,通过 xi x i 向前的参数修正值都恒为0,即不传播;
小结:
对于max pooling参数只通过max值那个点反向传播,在上述例子中,即通过 x9 x 9 向前修正参数,其他值均认为是无用数据丢弃;
Mean Pooling
概念:求解n x m矩阵的上所有点的均值
有矩阵如下:
147258369 1 2 3 4 5 6 7 8 9- 求解整个矩阵的mean pooling,则:
y=(x1+x2+⋯+xn)n=5 y = ( x 1 + x 2 + ⋯ + x n ) n = 5 - 反向传播时:
∂y∂xn=1n=19 ∂ y ∂ x n = 1 n = 1 9 - 小结:
对于mean pooling ,反向传播过程中,只是给传播链条添加一个常数 1n 1 n ,即作为固定权重使用
激活函数
同Pooling,没有需要更新的权重,起到了传播过程中的阀门作用
ReLU
- 公式:
y={0,x≤0x,x>0 y = { 0 , x ≤ 0 x , x > 0 - 反向传播时:
dydx={0,x≤01,x>0 d y d x = { 0 , x ≤ 0 1 , x > 0 - 小结:
对于输出值: x≤0 x ≤ 0 的神经元,流经ReLU层后的反向传播,该神经元以及前面对应的参数都会被丢弃,即不再更新参数
Sigmoid
- 公式:
y=11+e−x y = 1 1 + e − x - 反向传播时:
dydx=y(1−y) d y d x = y ( 1 − y )
tanh
- 公式:
y=ex−e−xex+e−x y = e x − e − x e x + e − x - 反向传播时:
dydx=2(1−y)(1+y) d y d x = 2 ( 1 − y ) ( 1 + y )
soft Max
公式:
yi=exi∑ni=0exi y i = e x i ∑ i = 0 n e x ixi x i :第i个输入值
yi y i : xi x i 对应的输出值- 反向传播时:
∂yi∂xi=yi(1−yi) ∂ y i ∂ x i = y i ( 1 − y i )
Loss函数
交叉熵
理论上均方差 C=(y−a)2n C = ( y − a ) 2 n 值小的程度,作为判断神经元预测结果和实际结果的偏离程度很好理解
但是,实际问题中,针对分类问题,交叉熵的表现比均方差来的好
- 设经过soft Max的神经元输出:
预测z样本1(k=1)样本2(k=2)样本3(k=2)类别1(i=1)0.90.10.1类别2(i=2)0.10.90.1类别3(i=3)0.10.10.9 预 测 z 类 别 1 ( i = 1 ) 类 别 2 ( i = 2 ) 类 别 3 ( i = 3 ) 样 本 1 ( k = 1 ) 0.9 0.1 0.1 样 本 2 ( k = 2 ) 0.1 0.9 0.1 样 本 3 ( k = 2 ) 0.1 0.1 0.9 - 实际结果:
实际y样本1(k=1)样本2(k=2)样本3(k=3)类别1(i=1)100类别2(i=2)010类别3(i=3)001 实 际 y 类 别 1 ( i = 1 ) 类 别 2 ( i = 2 ) 类 别 3 ( i = 3 ) 样 本 1 ( k = 1 ) 1 0 0 样 本 2 ( k = 2 ) 0 1 0 样 本 3 ( k = 3 ) 0 0 1 交叉熵公式:
Ck=−1n∑i=1n[y(k)ilnz(k)i+(1−y(k)i)ln(1−z(k)i)], y(k)i∈{0,1}C1≈0.035C2≈0.035C3≈0.035C=1m∑k=1m(Ck)≈0.035 C k = − 1 n ∑ i = 1 n [ y i ( k ) ln z i ( k ) + ( 1 − y i ( k ) ) ln ( 1 − z i ( k ) ) ] , y i ( k ) ∈ { 0 , 1 } C 1 ≈ 0.035 C 2 ≈ 0.035 C 3 ≈ 0.035 C = 1 m ∑ k = 1 m ( C k ) ≈ 0.035Ck C k :第k个样本的交叉熵
zi z i :某个样本的第i个类别预测结果
yi y i :某个样本的第i个类别实际结果- 反向传播时,
yi
y
i
是已知值:
∂C∂zi=∂C∂Ck∂Ckzi=1m(−y(k)inz(k)i), y(k)i∈{0,1} ∂ C ∂ z i = ∂ C ∂ C k ∂ C k z i = 1 m ( − y i ( k ) n z i ( k ) ) , y i ( k ) ∈ { 0 , 1 }
梯度更新代码实现
TBD