Skip to content

Commit

Permalink
Use glossaries and format.
Browse files Browse the repository at this point in the history
  • Loading branch information
zhanggyb committed Mar 29, 2017
1 parent d8ab1c0 commit 277a146
Show file tree
Hide file tree
Showing 4 changed files with 258 additions and 224 deletions.
24 changes: 12 additions & 12 deletions chap1.tex
Original file line number Diff line number Diff line change
Expand Up @@ -410,9 +410,9 @@ \section{神经网络的架构}
这样的设计最优法则。

目前为止,我们讨论的神经网络,都是以上一层的输出作为下一层的输入。这种网络被称为
\textbf{前馈}神经网络\index{前馈神经网络}。这意味着网络中是没有回路的~——~信息总
是向前传播,从不反向回馈。如果确实有回路,我们最终会有这样的情况:$\sigma$ 函数
的输入依赖于输出。这将难于理解,所以我们不允许这样的环路。
\textbf{前馈}神经网络。这意味着网络中是没有回路的~——~信息总是向前传播,从不反向
回馈。如果确实有回路,我们最终会有这样的情况:$\sigma$ 函数的输入依赖于输出。这
将难于理解,所以我们不允许这样的环路。

然而,也有一些人工神经网络的模型,其中反馈环路是可行的。这些模型被称为%
\href{http://en.wikipedia.org/wiki/Recurrent_neural_network}{递归神经网络}\index{递归神经网络}。这种
Expand Down Expand Up @@ -1241,10 +1241,10 @@ \subsection*{练习}
神经元,没有隐藏层。用随机梯度下降算法训练网络。你能达到多少识别率?
\end{itemize}

之前的内容中,我跳过了如何加载 MNIST 数据的细节。这很简单。这里列出了完整的代码。
用于存储 MNIST 数据的数据结构在文档注释中有详细描述~——~都是简单的类型,元组和
Numpy \lstinline!ndarry! 对象的列表(如果你不熟悉 \lstinline!ndarray!,那就把它
们看成向量):
前文中,我跳过了如何加载 MNIST 数据的细节。这很简单。这里列出了完整的代码。用于
存储 MNIST 数据的数据结构在文档注释中有详细描述~——~都是简单的类型,元组和 Numpy
\lstinline!ndarry! 对象的列表(如果你不熟悉 \lstinline!ndarray!,那就把它们看成
向量):

\lstinputlisting[language=Python]{code_samples/src/mnist_loader.py}

Expand Down Expand Up @@ -1386,14 +1386,14 @@ \section{迈向深度学习}
人脸~——~分解成在单像素层面上就可回答的非常简单的问题。它通过一系列多层结构来完成,
在前面的网络层,它回答关于输入图像非常简单明确的问题,在后面的网络层,它建立了一
个更加复杂和抽象的层级结构。包含这种多层结构~——~两层或更多隐藏层~——~的网络被称为%
\textbf{深度神经网络}。
\textbf{\gls{deep-neural-networks}}。

当然,我没有提到如何去递归地分解成子网络。手工设计网络中的\gls*{weight}和%
\gls*{bias}无疑是不切实际的。取而代之的是,我们希望使用学习算法来让网络能够自动
从训练数据中学习\gls*{weight}和偏差~——~这样,形成一个概念的层次结构。80 年代和90
年代的研究人员尝试了使用随机梯度下降和反向传播来训练深度网络。不幸的是,除了一些
特殊的结构,他们并没有取得很好的效果。虽然网络能够学习,但是学习速度非常缓慢,不
适合在实际中使用
从训练数据中学习\gls*{weight}\gls*{bias}~——~这样,形成一个概念的层次结构。80
年代和 90年代的研究人员尝试了使用随机梯度下降和反向传播来训练深度网络。不幸的是,
除了一些特殊的结构,他们并没有取得很好的效果。虽然网络能够学习,但是学习速度非常
缓慢,不适合在实际中使用

自 2006 年以来,人们已经开发了一系列技术使深度神经网络能够学习。这些深度学习技术
基于随机梯度下降和反向传播,并引进了新的想法。这些技术已经使更深(更大)的网络能
Expand Down
34 changes: 17 additions & 17 deletions chap2.tex
Original file line number Diff line number Diff line change
Expand Up @@ -209,12 +209,12 @@ \section{反向传播的四个基本方程}

现在,这个调皮鬼变好了,试着帮助你来优化代价,它试着找到可以让代价更小的$\Delta
z_j^l$。假设 $\frac{\partial C}{\partial z_j^l}$ 有一个很大的值(或正或负)。那
么这个调皮鬼可以通过选择与 $\frac{\partial C}{\partial z_j^l}$ 相反符号的
$\Delta z_j^l$ 来降低代价。相反,如果 $\frac{\partial C}{\partial z_j^l}$接近
$0$,那么调皮鬼并不能通过扰动带权输入 $z_j^l$ 来改善太多代价。在调皮鬼看来,这时
候神经元已经很接近最优了\footnote{这里需要注意的是,只有在 $\Delta z_j^l$ 很小的
时候才能够满足。我们需要假设调皮鬼只能进行微小的调整。}。所以这里有一种启发式
的认识,$\frac{\partial C}{\partial z_j^l}$ 是神经元的误差的度量。
么这个调皮鬼可以通过选择与 $\frac{\partial C}{\partial z_j^l}$ 相反符号的$\Delta
z_j^l$ 来降低代价。相反,如果 $\frac{\partial C}{\partial z_j^l}$接近$0$,那么调
皮鬼并不能通过扰动带权输入 $z_j^l$ 来改善太多代价。在调皮鬼看来,这时候神经元已
经很接近最优了\footnote{这里需要注意的是,只有在 $\Delta z_j^l$ 很小的时候才能够
满足。我们需要假设调皮鬼只能进行微小的调整。}。所以这里有一种启发式的认识,
$\frac{\partial C}{\partial z_j^l}$ 是神经元的误差的度量。

按照上面的描述,我们定义 $l$ 层的第 $j^{th}$ 个神经元上的误差 $\delta_j^l$ 为:
\begin{equation}
Expand Down Expand Up @@ -301,8 +301,8 @@ \section{反向传播的四个基本方程}
输出的误差方法。然后,我们进行 Hadamard 乘积运算 $\odot \sigma'(z^l)$。这会让误
差通过 $l$ 层的激活函数反向传递回来并给出在第 $l$ 层的带权输入的误差 $\delta$

通过组合 \eqref{eq:bp1} 和 \eqref{eq:bp2},我们可以计算任何层的误差 $\delta^l$
首先使用 \eqref{eq:bp1} 计算 $\delta^L$,然后应用方程~\eqref{eq:bp2} 来计算
通过组合~\eqref{eq:bp1} 和~\eqref{eq:bp2},我们可以计算任何层的误差 $\delta^l$
首先使用~\eqref{eq:bp1} 计算 $\delta^L$,然后应用方程~\eqref{eq:bp2} 来计算
$\delta^{L-1}$,然后再次用方程~\eqref{eq:bp2} 来计算 $\delta^{L-2}$,如此一步一
步地\gls*{bp}完整个网络。\\

Expand Down Expand Up @@ -357,7 +357,7 @@ \section{反向传播的四个基本方程}
和}了,并且,\gls*{weight}学习也会终止(或者学习非常缓慢)。类似的结果对于输出
神经元的\gls*{bias}也是成立的。

针对前面的层,我们也有类似的观点。特别地,注意在 \eqref{eq:bp2} 中的项
针对前面的层,我们也有类似的观点。特别地,注意在~\eqref{eq:bp2} 中的项
$\sigma'(z^l)$。这表示如果神经元已经接近饱和,$\delta_j^l$ 很可能变小。这就导致
任何输入进一个饱和的神经元的\gls*{weight}学习缓慢\footnote{如果 ${w^{l+1}}^T
\delta^{l+1}$ 拥有足够大的量能够补偿 $\sigma'(z_k^l)$ 的话,这里的推导就不能成
Expand Down Expand Up @@ -395,17 +395,17 @@ \section{反向传播的四个基本方程}
\subsection*{问题}

\begin{itemize}
\item \textbf{另一种\gls*{bp}方程的表示方式:} 我已经给出了使用 Hadamard 乘积的反
向传播的公式(尤其是 \eqref{eq:bp1} 和 \eqref{eq:bp2})。如果你对这种特殊的乘
积不熟悉,可能会有一些困惑。下面还有一种表示方式,那就是基于传统的矩阵乘法,
些读者可能会觉得很有启发。(1)证明 \eqref{eq:bp1} 可以写成
\item \textbf{另一种\gls*{bp}方程的表示方式:} 我已经给出了使用 Hadamard 乘积的
\gls*{bp}的公式(尤其是~\eqref{eq:bp1} 和~\eqref{eq:bp2})。如果你对这种特殊的
乘积不熟悉,可能会有一些困惑。下面还有一种表示方式,那就是基于传统的矩阵乘法,
某些读者可能会觉得很有启发。(1)证明~\eqref{eq:bp1} 可以写成
\begin{equation}
\delta^L = \Sigma'(z^L) \nabla_a C
\label{eq:33}\tag{33}
\end{equation}
其中 $\Sigma'(z^L)$ 是一个方阵,其对角线的元素是 $\sigma'(z_j^L)$,其他的元素
均是 $0$。注意,这个矩阵通过一般的矩阵乘法作用在 $\nabla_a C$ 上。(2)证明
\eqref{eq:bp2} 可以写成
均是 $0$。注意,这个矩阵通过一般的矩阵乘法作用在 $\nabla_a C$ 上。(2)
明~\eqref{eq:bp2} 可以写成
\begin{equation}
\delta^l = \Sigma'(z^l) (w^{l+1})^T \delta^{l+1}
\label{eq:34}\tag{34}
Expand Down Expand Up @@ -707,7 +707,7 @@ \section{在哪种层面上,反向传播是快速的算法?}
前向传播过程中主要的计算代价消耗在\gls*{weight}矩阵的乘法上,而\gls*{bp}则是计
\gls*{weight}矩阵的转置矩阵。这些操作显然有着类似的计算代价。}。所以%
\gls*{bp}总的计算代价大概是两倍的前向传播。比起直接计算导数,显然\gls*{bp}有着更
大的优势。所以即使\gls*{bp}看起来要比 \eqref{eq:46} 更加复杂,但实际上要更快。
大的优势。所以即使\gls*{bp}看起来要比~\eqref{eq:46} 更加复杂,但实际上要更快。

这个加速算法在 1986 年首次被众人接受,并直接导致神经网络可以处理的问题的扩展。这
也导致了大量的研究者涌向了神经网络方向。当然,\gls*{bp}并不是万能钥匙。在 1980
Expand Down Expand Up @@ -815,7 +815,7 @@ \section{反向传播:全局观}
\label{eq:52}\tag{52}
\end{equation}

这里我们对路径中所有可能的中间神经元选择进行求和。对比 \eqref{eq:47} 我们有
这里我们对路径中所有可能的中间神经元选择进行求和。对比~\eqref{eq:47} 我们有
\begin{equation}
\frac{\partial C}{\partial w^l_{jk}} = \sum_{mnp\ldots q} \frac{\partial
C}{\partial a^L_m} \frac{\partial a^L_m}{\partial a^{L-1}_n} \frac{\partial
Expand Down
Loading

0 comments on commit 277a146

Please sign in to comment.