深度学习第二周课程(下)

上一章节提到的梯度下降(Gradient Decent)过程需要多层嵌套For-Loop循环。这种循环非常耗费计算资源。为了降低计算资源消耗,提升计算效率,本章节引入向量计算(Vectorization)的概念。本章的主要内容也是围绕着向量计算和使用Python中的numpy库来实现限量计算的过程。

本章课程内容目录(与本文无关):

  • 向量计算(Vectorization)
  • 使用向量计算逻辑回归(Vectorizing Logistic Regression)
  • 使用向量计算逻辑回归中的梯度下降(Vectorizing Logistic Regression’s Gradient)
  • Python的广播(Broadcasting in Python)
  • Python/numpy向量的介绍
  • 逻辑回归里的Cost Function解释

安装一下jupyter

本章开始需要进行练习,Python是必须要装的,强烈建议Python3,课程使用Jupyter,这里也提示了一下安装,不过后来发现好像用处也不大。这个工具主要是可以把Python的程序脚本和文字进行混排,方便与演示。如果从来没有接触过Python的话,可以考虑用一下,毕竟这个是课程也在用的环境。如果有一点基础的话,Python有自己的IDE工具,PyCharm,很好用直接下载就行。

安装Python&Jupyter。因为一直写Python所以这个一直有没什么大问题,但是Jupyt这个倒是头一次见,好像是一种基于Browser的IDE,挺有意思的。具体可以访问以下几个地址:

  • 安装Python,我一直用Brew install就好了
  • 安装Pip,不过因为买了这个新电脑以后就没怎么写代码,所以竟然没有Pip。这个倒也不难,随便上网搜索“install pip”,两步简单操作就搞定了
  • 安装Jupyter,没有按照web上说的用pkg包的方式,只是担心会安装额外的Python3.所以选择了通过pip命令行形式进行安装。

OK,三个安装结束,键入下面命令,直接启动Browser的界面

1
jupyter notebook

下面是标准编辑页面(竟然Hexo的asset_img可以用,好激动,但是asset_link确实不行,估计是因为marked里面escape的问题)

首界面很简单,就是系统文件夹。右上角有新建功能,可以新建一个可运行的python文件。在课程中,Andrew主要介绍了 np.dot(i,j) 在程序中对比for-loop,超过300倍的优势。笔者后来自己查了一下原因,看来主要还是回到了Python作为解释性语言本身的问题。为了对初学者友好,Python作为解释性语言牺牲了许多性能上的东西。而np.dot之所以much faster,主要原因是一句Python语言,对应的是用C写成numpy库,这个库会将输入进来的数据进行编译,形成编译后的语言进行调用。这种方法,远好于Python一个字符一个字符的进行读取,并根据语法分析器进行描述,占据了大量的时间。当然其他原因也有许多,比如借助编译可以使用CPU或者GPU的SIMD指令集(Simple instuction multiple data)进行并行计算,大大提升效率。根据文章将,numpy的效率可以是原生python的2万倍。而据说选用cpython会达到20万倍之多。具体原理可以参看知乎上的这篇文章:

python的numpy向量化语句为什么会比for快?

建立神经网络的主要过程

先来回顾一下基础算法:

For one example $x^{(i)}$:

The cost is then computed by summing over all training examples:

建模过程

  • 定义模型结构(例如输入feature的数量)
  • 初始化模型参数
  • 升级参数(Gradient Descent)

讲上述三个部分逐个建立并整合进一个叫做model()的 $function$ 里。几个简单的 $function$ 会包含的 $sigmoid$ , initialize_with_zeros() , propagate()

特别说明,关于 propagate() 的算法回顾如下:
Forward Propagation:

  • You get X
  • You compute $A = \sigma(w^T X + b) = (a^{(1)}, a^{(2)}, …, a^{(m-1)}, a^{(m)})$
  • You calculate the cost function: $J = -\frac{1}{m}\sum_{i=1}^{m}y^{(i)}\log(a^{(i)})+(1-y^{(i)})\log(1-a^{(i)})$

Here are the two formulas you will be using:

下面的Code里面用到了一些“内积”、“外积”、“General Dot”的概念。在课程中有相关的联系材料。具体参见这个解释可能会更加实在

使用numpy进行行列式乘积的计算

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
m = X.shape[1]

# FORWARD PROPAGATION (FROM X TO COST)
### START CODE HERE ### (≈ 2 lines of code)
A = sigmoid(np.dot(X.T, w) + b).reshape(1, -1) # compute activation
cost = - (1/m) * np.sum(Y*np.log(A) + (1-Y) * np.log(1-A)) # compute cost
### END CODE HERE ###

# BACKWARD PROPAGATION (TO FIND GRAD)
### START CODE HERE ### (≈ 2 lines of code)
dw = 1/m * np.dot(X, (A-Y).T)
db = 1/m * np.sum(A-Y)
### END CODE HERE ###

assert(dw.shape == w.shape)
assert(db.dtype == float)
cost = np.squeeze(cost)
assert(cost.shape == ())

grads = {"dw": dw,
"db": db}

return grads, cost

总结一下,这里建立的初始模型包括
$sigmoid$, $initialize$, $propagate$

优化模型参数(Optimization)

  • 初始化参数
  • 计算cost function
  • 通过梯级下降的方式进行参数更新并计算w和b的结果()

最近基本的梯级下降依据如下:

where $\alpha$ is the learning rate

总结一下,这里建立的初始模型包括
$initialize$, $optimize$, $predict$

整合模型

合并模型建立$model$,使用plot建立拟合线

深度学习第二周课程(上)

这是一个比较数学化的一章。本章课程主要分为两部分(数学基础 + Python编程实践)。

让我们先来看看第一部分。该部分内容重点是基于神经网络的一个基础数学模型,其中包括:

  • 二元分类(Binary Classification)
  • 逻辑回归(Logistic Regression)
  • 逻辑回归中的Cost Function(Logistic Regression Cost Function)
  • 梯度下降(Gradient Decent)
  • 导数(Derivatives / Derivatives Examples)
  • 计算图(Computation Graph)
  • 计算图求导(Derivatives with a Computation Graph)
  • 梯度下架求逻辑回顾(Logistic Regression Gradient Decent)
  • 对m样本的梯度下降(Gradient Decent on m Examples)

下面我们分部分进行一些描述:

深度学习概论

在Andy Ng所讲的深度学习课程里,第一周的课相对比较简单,基本上以通识介绍为主。课程分为了一下几个部分:

  • 什么是神经网络
  • 监督学习的神经网络是什么
  • 为什么深度学习开始受到重视
  • 三巨头中的Geoffrey Hinton访谈

第一部分,什么是神经网络(Neural Network)

看一下关于房价是如何预测的,以及什么是Hidden Unit

第二部分,监督学习的神经网络是什么(Supervised Learning)

在神经网络中的监督学习是这个样子的

针对与结构化和非结构化,还是有一定区别的

第三部分,为什么深度学习开始受到重视(Why Neural Network take-off)

一张图片说明一切

第四部分,Geoffrey Hinton访谈

这部分是一个访谈,不算是学习内容。讲述了Hinton个人的成长,学习等等吧。两个有意思的Highlight

  • Hinton本人大学学生物物理,研究生学习心理学,博士开始研修AI,这也是为什么他在神经网络能做出重大贡献的主要原因吧
  • 另一个关键是对GAN的学习,生成对抗网络方面的了解。如何在unsupervised的情况下进行学习

关于如何用Hexo书写数学符号(深度学习前哨贴)

翻了几个帖子,总算是搞定了。最主要的帖子是以下两个

在hexo博客中使用Mathjax写LaTex数学公式”
如何在 hexo 中支持 Mathjax?
描述在 hexo 中使用矩阵的方法

另外,按照Hexo文档上写的,理论上Hexo-math应该已经支持MathJax了,但是似乎用起来有点问题,不知道是hexo文档的错,还是我自己那个地方配置有错,以后找时间在研究吧。地址如下:
https://github.com/hexojs/hexo-math

还有最后要提醒一点,本次修改以后,不能用Hexo原生提供的assert方式来写作了,需要使用纯markdown模式。目前感觉良好,不知道后续会不会有什么坑。目前看这个改变不会影响之前的东西。

markdown的书写格式

这是一个公式 $E=mc^2$
Simple inline $a = b + c$.

大功告成,接下来需要学习MathJax了
MathJax一些说明
原文文档