这周的视频主要讲了超参数搜索方法、Batch Norm归一化处理、SoftMax回归以及TensorFlow计算框架的使用。
搜索超参数
在之前的课程中出现了很多超参数,如学习率$a$、神经网络层数$l$,在求解过程中需要对超参数的取值进行调整。超参数的调整可以遵循以下几个规则
- 随机搜索优于网格搜索,在进行网格搜索时,同一个纬度取的值较少,如下图,同样是取25个值,在进行网格搜索时超参数1只使用了5个值,而进行随机搜索时参数1和参数2都使用了25个值。
- 由粗略搜索到精细搜索,即先在大范围内寻找效果好的区域范围,再在该范围内进行精细搜索
- 第1条中说的随机搜索并不是在有效范围内均匀随机取值,而是需要选择合适的坐标系。对于隐藏层数来说,可以在规定范围内进行均匀随机取值,如范围时2到4层,取值时选取2、3、4三个值。但是对于学习率α,其范围在0.0001到1之间,如果α有很大可能在0.0001到0.1之间,若随机均匀取值,那么在0.1到1之间将用去90%的资源,这是不合理的。这时候要是取对数坐标,就能在0.0001到0.1之间取得更多的值。
为了优化模型效果,通常有两种方式进行训练。第一种是选择一个模型进行训练,观察其代价函数,在其变化的过程中,不断调节超参数,使曲线不上升,这种方法适用于数据量大、时间充足的情况;第二种是同时建立多个模型,观察所有模型的代价函数,选择表现较好的模型,这种方法适用于计算能力较强的情况。
Batch Norm归一化处理
在视频中Ng把输入层归一化推广到隐含层归一化,并且从前向传播角度说明了Batch Norm的好处。其实可以从公式推导角度证明Batch Norm为什么可以加快训练速度。
当使用sigmoid函数作为激活函数时,其导数在x=0时取得最大值,当x远离0时其导数基本为0。而对于正态分布而言,有95%的数据在[-2,2]的范围内,这样在进行反向传播时出现梯度消失的数据较少,使得整体上保持较快速度收敛。如果不进行Batch Norm处理,数据就会落在激活函数的饱和区,这样梯度越来越小,甚至出现梯度消失现象。
下面说说Batch Norm的处理过程
$$\mu=\frac{1}{m}\sum_{i}^{}z^{(i)}$$
$$\sigma^2=\frac{1}{m}\sum_{i}^{} (z^{(i)}-\mu)^2$$
$$z^{(i)}_{norm}=\frac{z^{(i)-\mu}}{\sqrt{\sigma^2+\varepsilon}}$$
$${z^{(i)}_{norm}}^{‘} = \gamma z^{(i)}_{norm}+\beta$$
最后又加入了$\gamma$、$\beta$参数,同样可以通过梯度下降进行求解。
SoftMax回归
当进行二分类时,最后一层的激活函数可以采用sigmoid函数,当涉及多分类时就要用到softmax函数。先给出softmax函数的形式
$$h_{\theta}(x^{(i)})=
\begin{bmatrix}
p(y^{(i)}=1|x^{(i)};\theta)\\
p(y^{(i)}=2|x^{(i)};\theta)\\
\vdots\\
p(y^{(i)}=3|x^{(i)};\theta)\\
\end{bmatrix}=
\frac{1}{\sum_{j=1}^{k}e^{\theta^{T}_{j}x^{(i)}}}
\begin{bmatrix}
e^{\theta^{T}_{1}x^{(i)}}\\
e^{\theta^{T}_{2}x^{(i)}}\\
\vdots\\
e^{\theta^{T}_{k}x^{(i)}}\\
\end{bmatrix}
$$
举个视频的例子就是
softmax回归做了两件事情,第一步是将模型的每个输出加上了指数映射,将其取值范围定义在正实数,第二步是把经过转换的输出进行归一化,得到概率分布。在网上给出的推导版本中都是直接给出了softmax的指数形式,其实线性回归、logistic回归、softmax回归都是从广义线性模型推导出来的,当y的分布是正态分布时得到的就是线性模型,当y是两点分布时得到的是logistic回归模型,当y是多项式分布时得到的是softmax回归模型。
TensorFlow的使用
在进行神经网络搭建事,个人觉得还是keras比较好用,接口抽象的比较友好,不过既然视频提到了TensorFlow,那也研究一下吧,贴上代码
1 | #coding=utf-8 |
输出结果
1 | Epoch:1, w:-0.157984390855, b:0.157984390855 |