deeplearning课程学习报告(2)

    这个星期把neural networks&deep learning这一课程内容全部结束了,并完成了Convolutional Neural Networks课程之前剩下的一部分编程习题内容。预计下一周将Convolutional Neural Networks课程全部结束。正好上一次因为没有全部收尾,没有作第一课程的总结,现在就将neural networks&deep learning课程自我总结一下,至于Convolutional Neural Networks课程的部分下周再一起做总结吧。

    课程第一周主要是关于概论的问题,这里直接略过。。。


    课程第二周:神经网络基础。主要是关于逻辑回归问题相关内容。

  • 训练样本 \{(x^{(1)},y^{(1)}),(x^{(2)},y^{(2)}),\cdots,(x^{(m)},y^{(m)})\}。其中X.shape=(n_{x}, m)Y.shape=(1, m)

n_{x}为单个样本维度,m为样本容量。

  • 逻辑回归中预测值\[\hat h = P(y=1|x)\]表示为1的概率,取值范围在 [0,1] 之间。因此引入Sigmoid函数\hat y = Sigmoid(w^{T}x+b)=\sigma(w^{T}x+b)。其中Sigmoid(z)=\dfrac{1}{1+e^{-z}}。而Sigmoid函数的导数也可以用自身来表示
  • 对于逻辑回归的损失函数采用L(\hat y, y)=-(y\log\hat y+(1-y)\log(1-\hat y)),而不采用L(\hat y, y)=\dfrac{1}{2}(\hat y-y)^{2}的原因是后者可能是非凸函数,会得到局部最优解而不是全局最优解。至于损失函数的由来如下:

    \hat y 可以看作预测输出为正类(+1)的概率:

    \hat y = P(y=1|x)

    当 y=1 时, P(y|x)=\hat y ;当 y=0 时, P(y|x)=1-\hat y 。

    将两种情况整合到一个式子中,可得:

    P(y|x)=\hat y^{y}(1-\hat y )^{(1-y)}

    对上式进行log处理(这里是因为log函数是单调函数,不会改变原函数的单调性):

    \log P(y|x)=\log\left[\hat y^{y}(1-\hat y )^{(1-y)}\right]=y\log\hat y+(1-y)\log(1-\hat y)

    概率 P(y|x) 越大越好,即判断正确的概率越大越好。这里对上式加上负号,则转化成了单个样本的Loss function,我们期望其值越小越好,所以:

    L(\hat y, y)=-(y\log\hat y+(1-y)\log(1-\hat y))


  • 梯度下降法用来最小化Cost function,以计算出合适的w和b的值。

    每次迭代更新的修正表达式:

    w:=w-\alpha\dfrac{\partial J(w,b)}{\partial w}

    b:=b-\alpha\dfrac{\partial J(w,b)}{\partial b}

    在程序代码中,通常使用dw来表示 \dfrac{\partial J(w,b)}{\partial w} ,用db来表示 \dfrac{\partial J(w,b)}{\partial b} 。


  • 对单个样本而言,逻辑回归Loss function表达式:

z= w^{T}x+b

\hat y=a=\sigma(z)

L(a, y)=-(y\log (a)+(1-y)\log(1-a))

与之对应的关于da、dz的求导:

da = \dfrac{\partial L}{\partial a}=-\dfrac{y}{a}+\dfrac{1-y}{1-a}

dz = \dfrac{\partial L}{\partial z}=\dfrac{\partial L}{\partial a}\cdot\dfrac{\partial a}{\partial z}=(-\dfrac{y}{a}+\dfrac{1-y}{1-a})\cdot a(1-a)=a-y

再对 w_{1}、w_{2} 和b进行求导:

dw_{1} = \dfrac{\partial L}{\partial w_{1}}=\dfrac{\partial L}{\partial z}\cdot\dfrac{\partial z}{\partial w_{1}}=x_{1}\cdot dz=x_{1}(a-y)

db = \dfrac{\partial L}{\partial b }=\dfrac{\partial L}{\partial z}\cdot\dfrac{\partial z}{\partial b }=1\cdot dz=a-y

梯度下降法:

w_{1}:=w_{1}-\alpha dw_{1}

w_{2}:=w_{2}-\alpha dw_{2}

b:=b-\alpha db

对于m个样本求和取均值即可。


课程第三周:浅层神经网络。

  • 示意图如下:

每个节点对应z运算和a运算。对于a运算激活函数在不同的层可能会有不同的选择。课程中给出了四种运算如下:


在隐藏层中,tanh函数的表现要好于sigmoid函数,因为tanh取值范围为  [-1,+1]  ,输出分布在0值的附近,均值为0,从隐藏层到输出层数据起到了归一化(均值为0)的效果。
  • 在输出层上,对于二分类任务的输出取值为 \{0,1\} ,故一般会选择sigmoid函数。
  • 然而sigmoid和tanh函数在当 |z| 很大的时候,梯度会很小,在依据梯度的算法中,更新在后期会变得很慢。在实际应用中,要使 |z| 尽可能的落在0值附近。初始化时b一般设置为0,W权重矩阵一般取随机值并乘以0.01以使结果在0附近:

  • ReLU弥补了前两者的缺陷,当 z>0 时,梯度始终为1,从而提高神经网络基于梯度算法的运算速度。然而当 z<0 时,梯度一直为0,但是实际的运用中,该缺陷的影响不是很大。Leaky ReLU保证在 z<0 的时候,梯度仍然不为0。在选择激活函数的时候,如果在不知道该选什么的时候就选择ReLU,当然也没有固定答案,要依据实际问题在交叉验证集合中进行验证分析。

  • 梯度下降公式如下图:


参数说明如下:



课程第四周:深层神经网络。实际上相当于浅层神经网络的推广,相对于浅层(1 hidden layer)多了隐藏层数目。

  • 深层神经网络示意图如下(作业中采用了隐藏层激活函数为RELU的L层网络):


作业中给出一个取X.shape=(12288,209)作为例子,各参数如下:


前向传播:对于L层用循环(L-1)次实现

后向传播公式如下:


梯度更新:


  • 建立深层神经网络步骤大致如下:
1.初始化参数。包括超参数的选择,W,b的初始化等。
2.前向传播。即z运算和a运算并保存每一层信息。
3.误差计算。
4.后向传播。计算并返回dW,db,dA。
5.更新参数。完成对每一层W,b的更新。

2-5步迭代多次完成参数的学习。




以上部分笔记转载自https://zhuanlan.zhihu.com/p/35333489

猜你喜欢

转载自blog.csdn.net/stezio/article/details/80965977