Skip to content

Commit

Permalink
语言润色
Browse files Browse the repository at this point in the history
  • Loading branch information
fengdu78 committed Sep 2, 2018
1 parent 6f11ed7 commit bdadf31
Show file tree
Hide file tree
Showing 10 changed files with 695 additions and 500 deletions.
192 changes: 94 additions & 98 deletions html/week3.html

Large diffs are not rendered by default.

133 changes: 71 additions & 62 deletions html/week4.html

Large diffs are not rendered by default.

207 changes: 104 additions & 103 deletions html/week5.html

Large diffs are not rendered by default.

172 changes: 139 additions & 33 deletions html/week6.html

Large diffs are not rendered by default.

221 changes: 152 additions & 69 deletions html/week7.html

Large diffs are not rendered by default.

36 changes: 18 additions & 18 deletions markdown/week3.md
Original file line number Diff line number Diff line change
Expand Up @@ -132,7 +132,7 @@ ${\theta^{T}}x<0$ 时,预测 $y=0$

![](../images/f23eebddd70122ef05baa682f4d6bd0f.png)

对于线性回归模型,我们定义的代价函数是所有模型误差的平方和。理论上来说,我们也可以对逻辑回归模型沿用这个定义,但是问题在于,当我们将${h_\theta}\left( x \right)=\frac{1}{1+{e^{-\theta^{T}}X}}$带入到这样定义了的代价函数中时,我们得到的代价函数将是一个非凸函数(**non-convexfunction**)。
对于线性回归模型,我们定义的代价函数是所有模型误差的平方和。理论上来说,我们也可以对逻辑回归模型沿用这个定义,但是问题在于,当我们将${h_\theta}\left( x \right)=\frac{1}{1+{e^{-\theta^{T}x}}}$带入到这样定义了的代价函数中时,我们得到的代价函数将是一个非凸函数(**non-convexfunction**)。

![](../images/8b94e47b7630ac2b0bcb10d204513810.jpg)

Expand Down Expand Up @@ -295,7 +295,7 @@ ${h_\theta}\left( x \right)=\frac{1}{1+{{e}^{-{\theta^T}X}}}$

在先前的视频中,当我们在谈论线性回归的梯度下降法时,我们谈到了如何监控梯度下降法以确保其收敛,我通常也把同样的方法用在逻辑回归中,来监测梯度下降,以确保它正常收敛。

当使用梯度下降法来实现逻辑回归时,我们有这些不同的参数$\theta $,就是${\theta_{0}}$ ${\theta_{1}}$ ${\theta_{2}}$ 一直到${\theta_{n}}$,我们需要用这个表达式来更新这些参数。我们还可以使用 **for循环**来更新这些参数值,用 `for i=1 to n`,或者 `for i=1 to n+1`。当然,不用 **for循环**也是可以的,理想情况下,我们更提倡使用向量化的实现,可以把所有这些 n个参数同时更新
当使用梯度下降法来实现逻辑回归时,我们有这些不同的参数$\theta $,就是${\theta_{0}}$ ${\theta_{1}}$ ${\theta_{2}}$ 一直到${\theta_{n}}$,我们需要用这个表达式来更新这些参数。我们还可以使用 **for循环**来更新这些参数值,用 `for i=1 to n`,或者 `for i=1 to n+1`。当然,不用 **for循环**也是可以的,理想情况下,我们更提倡使用向量化的实现,可以把所有这些 $n$个参数同时更新

最后还有一点,我们之前在谈线性回归时讲到的特征缩放,我们看到了特征缩放是如何提高梯度下降的收敛速度的,这个特征缩放的方法,也适用于逻辑回归。如果你的特征范围差距很大的话,那么应用特征缩放的方法,同样也可以让逻辑回归中,梯度下降收敛更快。

Expand Down Expand Up @@ -472,10 +472,10 @@ ${h_\theta}\left( x \right)={\theta_{0}}+{\theta_{1}}{x_{1}}+{\theta_{2}}{x_{2}^

![](../images/ea76cc5394cf298f2414f230bcded0bd.jpg)

如果选择的正则化参数λ过大,则会把所有的参数都最小化了,导致模型变成 ${h_\theta}\left( x \right)={\theta_{0}}$,也就是上图中红色直线所示的情况,造成欠拟合。
如果选择的正则化参数$\lambda$ 过大,则会把所有的参数都最小化了,导致模型变成 ${h_\theta}\left( x \right)={\theta_{0}}$,也就是上图中红色直线所示的情况,造成欠拟合。
那为什么增加的一项$\lambda =\sum\limits_{j=1}^{n}{\theta_j^{2}}$ 可以使$\theta $的值减小呢?
因为如果我们令 $\lambda$ 的值很大的话,为了使**Cost Function** 尽可能的小,所有的 $\theta $ 的值(不包括${\theta_{0}}$)都会在一定程度上减小。
但若λ的值太大了,那么$\theta $(不包括${\theta_{0}}$)都会趋近于0,这样我们所得到的只能是一条平行于$x$轴的直线。
但若$\lambda$ 的值太大了,那么$\theta $(不包括${\theta_{0}}$)都会趋近于0,这样我们所得到的只能是一条平行于$x$轴的直线。
所以对于正则化,我们要取一个合理的 $\lambda$ 的值,这样才能更好的应用正则化。
回顾一下代价函数,为了使用正则化,让我们把这些概念应用到到线性回归和逻辑回归中去,那么我们就可以让他们避免过度拟合了。

Expand All @@ -494,13 +494,13 @@ $J\left( \theta \right)=\frac{1}{2m}\sum\limits_{i=1}^{m}{[({{({h_\theta}({{x}^

$Repeat$ $until$ $convergence${

${\theta_0}:={\theta_0}-a\frac{1}{m}\sum\limits_{i=1}^{m}{(({h_\theta}({{x}^{(i)}})-{{y}^{(i)}})x_{0}^{(i)}})$

${\theta_j}:={\theta_j}-a[\frac{1}{m}\sum\limits_{i=1}^{m}{(({h_\theta}({{x}^{(i)}})-{{y}^{(i)}})x_{j}^{\left( i \right)}}+\frac{\lambda }{m}{\theta_j}]$

$for$ $j=1,2,...n$

}
${\theta_0}:={\theta_0}-a\frac{1}{m}\sum\limits_{i=1}^{m}{(({h_\theta}({{x}^{(i)}})-{{y}^{(i)}})x_{0}^{(i)}})$
${\theta_j}:={\theta_j}-a[\frac{1}{m}\sum\limits_{i=1}^{m}{(({h_\theta}({{x}^{(i)}})-{{y}^{(i)}})x_{j}^{\left( i \right)}}+\frac{\lambda }{m}{\theta_j}]$
$for$ $j=1,2,...n$
}


对上面的算法中$ j=1,2,...,n$ 时的更新式子进行调整可得:
Expand Down Expand Up @@ -545,13 +545,13 @@ def costReg(theta, X, y, learningRate):

$Repeat$ $until$ $convergence${

${\theta_0}:={\theta_0}-a\frac{1}{m}\sum\limits_{i=1}^{m}{(({h_\theta}({{x}^{(i)}})-{{y}^{(i)}})x_{0}^{(i)}})$

${\theta_j}:={\theta_j}-a[\frac{1}{m}\sum\limits_{i=1}^{m}{({h_\theta}({{x}^{(i)}})-{{y}^{(i)}})x_{j}^{\left( i \right)}}+\frac{\lambda }{m}{\theta_j}]$

$for$ $j=1,2,...n$

}
${\theta_0}:={\theta_0}-a\frac{1}{m}\sum\limits_{i=1}^{m}{(({h_\theta}({{x}^{(i)}})-{{y}^{(i)}})x_{0}^{(i)}})$
${\theta_j}:={\theta_j}-a[\frac{1}{m}\sum\limits_{i=1}^{m}{({h_\theta}({{x}^{(i)}})-{{y}^{(i)}})x_{j}^{\left( i \right)}}+\frac{\lambda }{m}{\theta_j}]$
$for$ $j=1,2,...n$
}

注:看上去同线性回归一样,但是知道 ${h_\theta}\left( x \right)=g\left( {\theta^T}X \right)$,所以与线性回归不同。
**Octave** 中,我们依旧可以用 `fminuc` 函数来求解代价函数最小化的参数,值得注意的是参数${\theta_{0}}$的更新规则与其他情况不同。
Expand Down
6 changes: 3 additions & 3 deletions markdown/week4.md
Original file line number Diff line number Diff line change
Expand Up @@ -149,8 +149,8 @@ ${{z}^{\left( 2 \right)}}={{\Theta }^{\left( 1 \right)}}\times {{X}^{T}} $

![](../images/10342b472803c339a9e3bc339188c5b8.png)

其实神经网络就像是logistic regression,只不过我们把**logistic regression**中的输入向量$\left[ x_1\sim {x_3} \right]$ 变成了中间层的$\left[ a_1^{(2)}\sim a_3^{(2)} \right]$, 即: $h_\theta(x)=g\left( \theta_0^{\left( 2 \right)}a_0^{\left( 2 \right)}+\theta_1^{\left( 2 \right)}a_1^{\left( 2 \right)}+\theta_{2}^{\left( 2 \right)}a_{2}^{\left( 2 \right)}+\theta_{3}^{\left( 2 \right)}a_{3}^{\left( 2 \right)} \right)$
我们可以把$a_0, a_1, a_2, a_3$看成更为高级的特征值,也就是$x_0, x_1, x_2, x_3$的进化体,并且它们是由 $x$与决定的,因为是梯度下降的,所以$a$是变化的,并且变得越来越厉害,所以这些更高级的特征值远比仅仅将 $x$次方厉害,也能更好的预测新数据。
其实神经网络就像是**logistic regression**,只不过我们把**logistic regression**中的输入向量$\left[ x_1\sim {x_3} \right]$ 变成了中间层的$\left[ a_1^{(2)}\sim a_3^{(2)} \right]$, 即: $h_\theta(x)=g\left( \Theta_0^{\left( 2 \right)}a_0^{\left( 2 \right)}+\Theta_1^{\left( 2 \right)}a_1^{\left( 2 \right)}+\Theta_{2}^{\left( 2 \right)}a_{2}^{\left( 2 \right)}+\Theta_{3}^{\left( 2 \right)}a_{3}^{\left( 2 \right)} \right)$
我们可以把$a_0, a_1, a_2, a_3$看成更为高级的特征值,也就是$x_0, x_1, x_2, x_3$的进化体,并且它们是由 $x$与$\theta$决定的,因为是梯度下降的,所以$a$是变化的,并且变得越来越厉害,所以这些更高级的特征值远比仅仅将 $x$次方厉害,也能更好的预测新数据。
这就是神经网络相比于逻辑回归和线性回归的优势。


Expand Down Expand Up @@ -181,7 +181,7 @@ ${{z}^{\left( 2 \right)}}={{\Theta }^{\left( 1 \right)}}\times {{X}^{T}} $

所以我们有:$h_\Theta(x) \approx \text{x}_1 \text{AND} \, \text{x}_2$

所以我们的:
所以我们的:$h_\Theta(x) $

这就是**AND**函数。

Expand Down
7 changes: 3 additions & 4 deletions markdown/week5.md
Original file line number Diff line number Diff line change
Expand Up @@ -25,15 +25,14 @@ $K$类分类:$S_L=k, y_i = 1$表示分到第$i$类;$(k>2)$

$ J\left(\theta \right)=-\frac{1}{m}\left[\sum_\limits{i=1}^{m}{y}^{(i)}\log{h_\theta({x}^{(i)})}+\left(1-{y}^{(i)}\right)log\left(1-h_\theta\left({x}^{(i)}\right)\right)\right]+\frac{\lambda}{2m}\sum_\limits{j=1}^{n}{\theta_j}^{2} $


在逻辑回归中,我们只有一个输出变量,又称标量(**scalar**),也只有一个因变量$y$,但是在神经网络中,我们可以有很多输出变量,我们的$h_\theta(x)$是一个维度为$K$的向量,并且我们训练集中的因变量也是同样维度的一个向量,因此我们的代价函数会比逻辑回归更加复杂一些,为:$\newcommand{\subk}[1]{ #1_k }$
$$h_\theta\left(x\right)\in \mathbb{R}^{K}$$ $${\left({h_\theta}\left(x\right)\right)}_{i}={i}^{th} \text{output}$$

$J(\Theta) = -\frac{1}{m} \left[ \sum\limits_{i=1}^{m} \sum\limits_{k=1}^{k} {y_k}^{(i)} \log \subk{(h_\Theta(x^{(i)}))} + \left( 1 - y_k^{(i)} \right) \log \left( 1- \subk{\left( h_\Theta \left( x^{(i)} \right) \right)} \right) \right] + \frac{\lambda}{2m} \sum\limits_{l=1}^{L-1} \sum\limits_{i=1}^{s_l} \sum\limits_{j=1}^{s_l+1} \left( \Theta_{ji}^{(l)} \right)^2$

这个看起来复杂很多的代价函数背后的思想还是一样的,我们希望通过代价函数来观察算法预测的结果与真实情况的误差有多大,唯一不同的是,对于每一行特征,我们都会给出$K$个预测,基本上我们可以利用循环,对每一行特征都预测$K$个不同结果,然后在利用循环在$K$个预测中选择可能性最高的一个,将其与$y$中的实际数据进行比较。

正则化的那一项只是排除了每一层$\theta_0$后,每一层的$\theta$ 矩阵的和。最里层的循环$j$循环所有的行(由$s_l$ +1 层的激活单元数决定),循环$i$则循环所有的列,由该层($s_l$层)的激活单元数所决定。即:$h_\theta(x)$与真实值之间的距离为每个样本-每个类输出的加和,对参数进行**regularization****bias**项处理所有参数的平方和。
正则化的那一项只是排除了每一层$\theta_0$后,每一层的$\theta$ 矩阵的和。最里层的循环$j$循环所有的行(由$s_l$ +1 层的激活单元数决定),循环$i$则循环所有的列,由该层($s_l$层)的激活单元数所决定。即:$h_\theta(x)$与真实值之间的距离为每个样本-每个类输出的加和,对参数进行**regularization****bias**项处理所有参数的平方和。

### 9.2 反向传播算法

Expand All @@ -44,15 +43,15 @@ $J(\Theta) = -\frac{1}{m} \left[ \sum\limits_{i=1}^{m} \sum\limits_{k=1}^{k} {y_
现在,为了计算代价函数的偏导数$\frac{\partial}{\partial\Theta^{(l)}_{ij}}J\left(\Theta\right)$,我们需要采用一种反向传播算法,也就是首先计算最后一层的误差,然后再一层一层反向求出各层的误差,直到倒数第二层。
以一个例子来说明反向传播算法。

假设我们的训练集只有一个实例$\left({x}^{(1)},{y}^{(1)}\right)$,我们的神经网络是一个四层的神经网络,其中$K=4,S_{L}=4,L=4$:
假设我们的训练集只有一个样本$\left({x}^{(1)},{y}^{(1)}\right)$,我们的神经网络是一个四层的神经网络,其中$K=4,S_{L}=4,L=4$:

前向传播算法:

![](../images/2ea8f5ce4c3df931ee49cf8d987ef25d.jpg)

![](../images/6a0954ad41f959d7f272e8f53d4ee2de.jpg)

我们从最后一层的误差开始计算,误差是激活单元的预测($\subk{a^{(4)}}$)与实际值($y^k$)之间的误差,($k=1:k$)。
我们从最后一层的误差开始计算,误差是激活单元的预测(${a^{(4)}}$)与实际值($y^k$)之间的误差,($k=1:k$)。
我们用$\delta$来表示误差,则:$\delta^{(4)}=a^{(4)}-y$
我们利用这个误差值来计算前一层的误差:$\delta^{(3)}=\left({\Theta^{(3)}}\right)^{T}\delta^{(4)}\ast g'\left(z^{(3)}\right)$
其中 $g'(z^{(3)})$是 $S$ 形函数的导数,$g'(z^{(3)})=a^{(3)}\ast(1-a^{(3)})$。而$(θ^{(3)})^{T}\delta^{(4)}$则是权重导致的误差的和。下一步是继续计算第二层的误差:
Expand Down
Loading

0 comments on commit bdadf31

Please sign in to comment.