- c++的行指针、列指针
- 卷积底层的实现方式(如caffe里面的img2col)
- 推导逻辑回归的损失函数和梯度计算
sigmoid函数及其导数:
h ( x ) = 1 1 − e − x h ′ ( x ) = h ( x ) ⋅ [ 1 − h ( x ) ] h(x)=\frac{1}{1-e^{-x}}\\ h'(x)=h(x)\cdot[1-h(x)] h(x)=1−e−x1h′(x)=h(x)⋅[1−h(x)]
前向:
z i = h ( w x i ) J = − 1 m ∑ i = 1 m y i ln z i + ( 1 − y i ) ln ( 1 − z i ) z_i=h(\bm{w}x_i )\\ J=-\frac{1}{m}\sum_{i=1}^{m}y_i\ln z_i+(1-y_i)\ln(1-z_i) zi=h(wxi)J=−m1i=1∑myilnzi+(1−yi)ln(1−zi)
反向(省略了求和):
∂ J ∂ w = ∂ J ∂ z × ∂ z ∂ w \frac{\partial J}{\partial \bm{w}}=\frac{\partial J}{\partial z}\times\frac{\partial z}{\partial \bm{w}} ∂w∂J=∂z∂J×∂w∂z
∂ J ∂ z = y i z i − 1 − y i 1 − z i = y i − z i z i ( 1 − z i ) ∂ z ∂ w = h ′ ( w x i ) × x i = z i ( 1 − z i ) x i \frac{\partial J}{\partial z}=\frac{y_i}{z_i}-\frac{1-y_i}{1-z_i}=\frac{y_i-z_i}{z_i(1-z_i)}\\ \frac{\partial z}{\partial \bm{w}}=h'(\bm{w}x_i)\times x_i=z_i(1-z_i)x_i ∂z∂J=ziyi−1−zi1−yi=zi(1−zi)yi−zi∂w∂z=h′(wxi)×xi=zi(1−zi)xi
∂ J ∂ w = ( y i − z i ) x i \frac{\partial J}{\partial \bm{w}}=(y_i-z_i)x_i ∂w∂J=(yi−zi)xi - dropout在训练和测试时不同,怎么保证测试结果稳定
训练时以一定的概率使神经元失活,实际上就是让对应神经元的输出为0。
假设失活概率为 p ,就是这一层中的每个神经元都有p的概率失活,如下图的三层网络结构中,如果失活概率为0.5,则平均每一次训练有3个神经元失活,所以输出层每个神经元只有3个输入(期望为 ( 1 + 0 + 0 + 1 + 0 + 1 ) / 6 = 0.5 (1+0+0+1+0+1)/6=0.5 (1+0+0+1+0+1)/6=0.5),而实际测试时是不会有dropout的,输出层每个神经元都有6个输入(期望为 ( 1 + 1 + 1 + 1 + 1 + 1 ) / 6 = 1 (1+1+1+1+1+1)/6=1 (1+1+1+1+1+1)/6=1),这样在训练和测试时,输出层每个神经元的输入和的期望会有量级上的差异。
因此在训练时还要对第二层的输出数据除以(1-p)之后再传给输出层神经元,作为神经元失活的补偿,以使得在训练时和测试时每一层输入有大致相同的期望。原文链接
具体过程如下图(原图为了说明Dropout 与 BN一起使用时存在的问题):
- 如何在n个数组中找出它的中位数(n个数组无法完全放在内存中)
参考牛客:数据流中的中位数
面试知识点总结1
最新推荐文章于 2023-07-23 11:35:34 发布