吴恩达机器学习笔记

神经网络

小收获:神经重接实验。把耳朵到听觉皮层的神经切断,在这种情况下,将其重新接到一个动物的大脑上,这样从眼睛到视神经的信号最终将传到听觉皮层,如果这样做了,那么结果表明,听觉皮层将会学会“看”,这里“看”代表了,我们所知道的每层含义。所以,如果你对动物这样做,那么动物就可以完成视觉辨别任务,它们可以看图像,并根据图像做出适当的决定,它们正是通过脑组织中的这个部分完成的。也就是说,大脑皮层的虽然划分了信息处理的区域,不同区域的皮层处理不同信息,但实际上每个部分都能够通过自身学习来对其他信息进行处理。

在一些现实问题(比如图像识别)中,特征数量可能有上亿个,而组成预测模型的多项式更是在特征数量的基础上成几何倍数增长。

1 人工神经元

大脑中的神经元由多个树突和一个轴突组成,树突输入其他神经元传递过来的信息,在该神经元进行处理后,将处理结果由轴突输出给另一个神经元。机器学习中的神经元以此为模板,一个人工神经元将多个输入信息进行处理,经过一个或多个中间层,最终产出一个信息输出给另一个神经元。

举例:

每一层的\(x_0\)固定取值1,不是由前面的信息处理得到的,\(x_0\)称为偏置节点

第一层(输入层)将数据传入第二层,经过1-2层和2-3层的处理后最终输出预测函数。输入层和输出层中间可能不止一层,这些中间层也称为“隐蔽层”。

在神经网络中,我们称\(\theta \)为权重

第二层的节点称为激活节点(activation units),通过逻辑激活函数(Logistic activation function,就是分类问题中的逻辑函数)对第一层的数据进行处理从而得到第二层节点的数据a,a称为激活节点上的激励值。

\(\Theta ^j\)矩阵是从第\(j\)层到第\(j+1\)层的权重矩阵。

例如:

\(\Theta ^(1)\)矩阵表示从1-2层的权重矩阵,大小为3*4,\(\Theta ^(2)\)矩阵表示2-3层的权重矩阵

也即$$\begin{align*}a_1^{(2)} = g(z_1^{(2)}) \newline a_2^{(2)} = g(z_2^{(2)}) \newline a_3^{(2)} = g(z_3^{(2)}) \newline \end{align*}$$

$$z_k^{(2)} = \Theta_{k,0}^{(1)}x_0 + \Theta_{k,1}^{(1)}x_1 + \cdots + \Theta_{k,n}^{(1)}x_n$$

注意从\(j\)层到\(j+1\)层,输入有偏置节点,输出无。如果网络在第\(j\)层中有\(s_j\)个单位,在第\(j + 1\)层中有\(s_{j + 1}\)个单位,则\(\Theta _j\)的维数为\(s_{j+1}\times (s_j + 1)\)。

$$h_\Theta(x) = a^{(j+1)} = g(z^{(j+1)})$$

请注意,在最后一步中,在第\(j\)层和第\(j + 1\)层之间,我们所做的事情与在逻辑回归中所做的完全相同。在神经网络中添加所有这些中间层,使我们可以更优雅地产生有趣且更复杂的非线性假设。

2 应用举例1

用三层神经网络实现同或逻辑计算(XNOR),即\(x_1\)和\(x_2\)相同则计算结果为1,不同则计算结果为0,这里\(x_1\)和\(x_2\)在\(\left \{ 0,1\right \}\)中取值。

当\(x_1\)和\(x_2\)都为0或者都为1的时候XNOR计算输出1,这里共包含了三个逻辑计算,AND,NOR,OR。AND和NOR组成了第二层神经网络,OR组成了第三层神经网络。

首先写出这三种基础逻辑计算神经元的权重,

$$\begin{align*}AND:\newline\Theta^{(1)} &=\begin{bmatrix}-30 & 20 & 20\end{bmatrix} \newline NOR:\newline\Theta^{(1)} &= \begin{bmatrix}10 & -20 & -20\end{bmatrix} \newline OR:\newline\Theta^{(1)} &= \begin{bmatrix}-10 & 20 & 20\end{bmatrix} \newline\end{align*}$$

神经网络的组成结构为:

$$\begin{align*}\begin{bmatrix}x_0 \newline x_1 \newline x_2\end{bmatrix} \rightarrow\begin{bmatrix}a_1^{(2)} \newline a_2^{(2)} \end{bmatrix} \rightarrow\begin{bmatrix}a^{(3)}\end{bmatrix} \rightarrow h_\Theta(x)\end{align*}$$

第一层权重矩阵\(\Theta ^{(1}\)为:

$$\Theta^{(1)} =\begin{bmatrix}-30 & 20 & 20 \newline 10 & -20 & -20\end{bmatrix}$$

第二层权重矩阵\(\Theta ^{(2}\)为:

$$\Theta^{(2)} =\begin{bmatrix}-10 & 20 & 20\end{bmatrix}$$

第二层激励值、第三层激励值和预测结果为:

$$\begin{align*}& a^{(2)} = g(\Theta^{(1)} \cdot x) \newline& a^{(3)} = g(\Theta^{(2)} \cdot a^{(2)}) \newline& h_\Theta(x) = a^{(3)}\end{align*}$$

4 反向传播(Backpropagation Algorithm)

首先规定:

  • L = total number of layers in the network
  • s_lsl​ = number of units (not counting bias unit) in layer l
  • K = number of output units/classes
  • \((h_\Theta (x^{(i)}))_k)\)表示第k个output的假设函数

神经网络的代价函数(Cost Function)在逻辑回归代价函数的基础上变化:

$$\begin{gather*} J(\Theta) = – \frac{1}{m} \sum_{i=1}^m \sum_{k=1}^K \left[y^{(i)}_k \log ((h_\Theta (x^{(i)}))_k) + (1 – y^{(i)}_k)\log (1 – (h_\Theta(x^{(i)}))_k)\right] + \frac{\lambda}{2m}\sum_{l=1}^{L-1} \sum_{i=1}^{s_l} \sum_{j=1}^{s_{l+1}} ( \Theta_{j,i}^{(l)})^2\end{gather*}$$

第一部分中遍历所有输出节点的求和;正则化部分中包含多个\(\theta\)矩阵(仍是将每一项平方)。

反向传播的目的是将代价函数最小化,其本质是梯度下降法,在前向传播完成后,对误差进行反向传播,更新权值。

https://www.cnblogs.com/charlotte77/p/5629865.html

5 梯度检查

使用梯度检查法来检查反向传播算法的代码是否有误,注意,梯度检查法只适用于检验,因为它的效率太低,在开始求最优参数时务必将梯度检查法的代码关掉。


\(\epsilon\)取一个小值如\(\epsilon=10^{-4}\),但也不能过小。

epsilon = 1e-4;
for i = 1:n,
  thetaPlus = theta;
  thetaPlus(i) += epsilon;
  thetaMinus = theta;
  thetaMinus(i) -= epsilon;
  gradApprox(i) = (J(thetaPlus) - J(thetaMinus))/(2*epsilon)
end;

 gradApprox ≈ deltaVector,则反向传播算法代码正确。

6 随机初始化

将所有\(theta\)权重初始化为零不适用于神经网络。当我们反向传播时,所有节点将重复更新为相同的值。相反,我们可以使用以下方法为\(\Theta\)矩阵随机初始化权重:

为所有\(\theta\)在\([-\epsilon,\epsilon]\)中赋值,以保证打破对称
%If the dimensions of Theta1 is 10x11, Theta2 is 10x11 and Theta3 is 1x11.

Theta1 = rand(10,11) * (2 * INIT_EPSILON) - INIT_EPSILON;
Theta2 = rand(10,11) * (2 * INIT_EPSILON) - INIT_EPSILON;
Theta3 = rand(1,11) * (2 * INIT_EPSILON) - INIT_EPSILON;

7 小结

首先,确定要构造的神经网络的结构:

  • 输入层单元数 = 特征维数
  • 输出层单元数 = 分类类别数
  • 隐含层单元数通常越多越好,但是过多的单元数会导致代价过大
  • 默认1个隐含层,如果隐含层有多个,推荐每个隐含层的单元数相等

Training a Neural Network

  1. Randomly initialize the weights
  2. Implement forward propagation to get h_\Theta(x^{(i)})hΘ​(x(i)) for any x^{(i)}x(i)
  3. Implement the cost function
  4. Implement backpropagation to compute partial derivatives
  5. Use gradient checking to confirm that your backpropagation works. Then disable gradient checking.
  6. Use gradient descent or a built-in optimization function to minimize the cost function with the weights in theta.
for i = 1:m,
   Perform forward propagation and backpropagation using example (x(i),y(i))
   (Get activations a(l) and delta terms d(l) for l = 2,...,L

发表评论

电子邮件地址不会被公开。

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据