==提示:为方便阅读,《deeplearning.ai深度学习笔记》系列博文已统一整理到 http://dl-notes.imshuai.com==

Basics of Neural Network Programming

Logistic Regression as a Neural Network

Binary Classification

  1. Example: 给一张64x64像素的图片图片,判断是否含有猫
  2. 获取图片的RGB像素值 Screen-Shot-2018-06-02-at-17.20.31
  3. 并unroll成一个vector \(X^{(i)}\) Screen-Shot-2018-06-02-at-17.20.42
  4. 所有的vector组成数据集矩阵\(X\) Screen-Shot-2018-06-02-at-17.25.21 特别注意,\(X\)的行是\(n\),列是\(m\),和Machine learning中的定义正好是转置的关系。这样有个好处,每条测试集在矩阵中都是以列向量的形式存在。

  5. DeepLearning常用Notations:
    • \(m\): number of examples in datasets
    • \(n_x\): input size(即feature的个数)
    • \(n_y\): output size(即分类个数)
    • \(X \in \mathbb{R}^{n_x\times m} \) :the input matrix
    • \(Y \in \mathbb{R}^{n_y\times m} \) :the input matrix
    • 带括号的上标\(^{(i)}\),表示和training example相关的计数

完整的notation,可以参考课程中提供的PDF: Standard notations for Deep Learning Screen-Shot-2018-06-10-at-21.21.45 Screen-Shot-2018-06-10-at-21.21.58

  1. 使用Python中的reshape方法,整理矩阵的维度。

Logistic Regression

  1. 问题描述: Logsitic Regression要求输出y不是0就是1。The goal of logistic regression is to minimize the error between its predictions and training data. Screen-Shot-2018-06-02-at-17.37.35
  2. sigmoid function Screen-Shot-2018-06-02-at-17.45.47 ==这里有个疑问,为什么sigmoid处理后的值,可以代表y=1概率?== 参考:Logistic distribution
  3. 引入参数w, b,其实就是Machine learning中用的是θ,但DeepLearning中分别用w和b表示。其中w是vector,b是real number
  4. 这里 𝑦̂ 就是Machine learning里面的hypothesis function: h(θ)

Logistic Regression Cost Funciton

  1. Loss (error) function的定义: Screen-Shot-2018-06-02-at-17.52.42 分成y为0和1两种情况去理解这个函数,本质上就是对𝑦̂做对数处理而已。 因为对数处理后确实达到了Loss function的要求(我自己的理解):1.值域是大于等于0的实数集。 2. 随着𝑦̂ 单调递减。y=𝑦̂ 的时候为0,反之趋向于∞。3. 是参数的凸函数(convex)4. 是y和𝑦̂的函数

  2. 没有使用square error,因为是non-convex,无法使用Gradient Descent算法
  3. Loss function是针对单个training example的,而Cost function是Loss Function的在所有training example上的均值Screen-Shot-2018-06-02-at-18.03.20 在Machine learning里,没有引入Loss Function,其实有一个Loss Function,更好理解。

Gradient Descent

Gradient Descent的原理(Intuition):按梯度最大的方向逼近最小值。 Screen-Shot-2018-06-02-at-20.48.07

Gradient Descent算法步骤:

  1. Initialize \(w\), \(b\) to zero
  2. repeat:

\(w\ :=w - w\frac{\partial J( w,b)}{\partial w}\) \(b\ :=b - b\frac{\partial J( w,b)}{\partial b}\)

Derivatives

为不了解导数的人介绍导数的直观含义,这里不作说明了。

More Derivative Examples

为不了解导数的人介绍导数的直观含义,这里不作说明了。

Computation graph

从左到右:计算函数J 从右到左:计算J对参数w和b导数

Derivative with a Computation Graph

  • 其实是就是复合函数的链式法则。
  • 计算图左边的变量的偏导数依赖于右边的偏导数,右边的偏导数计算后,可以被左边的计算复用。

在Python中表示偏导数 \(dvar = \frac{\partial J}{\partial var}\)

Logistic Regression Gradient Descent

使用Computation Graph计算

Screen-Shot-2018-06-04-at-08.26.07

虽然,测试集是离散的,但并不代表对w的倒数是离散的,这两者没有任何关系。始终注意:在gradient Descent的时候,x是常量

Gradient Descent on m Examples

Cost Function的偏导是Loss Function偏导的均值: \(\frac{\partial J(w,b)}{\partial w_j} =\frac{1}{m} \sum_{i=1}^{m} \frac{\partial \mathcal{L}(a^{(i)},y^{(i)})}{\partial w_j^{(i)}}\)

Gradient Descent算法过程:

  1. 求导过程 求导过程又通常是先forward propagation求cost function,然后再backward propagation求到w和b的倒数
  2. 下降过程 使用到w和b的导数,迭代做梯度下降过程。

下面的截图就是一个非向量化的实现: 左边是求导过程,右边是梯度下降过程 Screen-Shot-2018-06-04-at-09.02.27

Python and Vectorization

Vectorization

  1. 什么是Vectorization:将 for loop 尽可能转换为矩阵运算。举例: \(z = w^Tx + b\) Screen-Shot-2018-06-04-at-09.13.25

  2. vectorization的好处:conciser code, but faster execution 一个简单的对比实验:1,000,000大小的两个向量内积计算,for loop要比Vectorization快300倍。 在DeepLearning时代,vectorization是一项重要的技能。

  3. SIMD Both CPU and GPU have parallelization instructions(i.e. SIMD, Signle Instruction Multiple Data)

More vectorization Examples

  1. 原则:whenever possible, avoid explict for-loops
  2. 使用Element wised的矩阵运算,将函数作用在每个矩阵元素上,比如:
    • np.exp()
    • np.log()
    • np.abs()
    • np.maxium()
    • 1/v
    • v**2

Vectorizing logistic Regression

Screen-Shot-2018-06-04-at-19.50.07

\[A = \sigma(w^T X + b) = (a^{(1)}, a^{(2)}, ..., a^{(m-1)}, a^{(m)})\]

(我始终觉得A应该小写,毕竟还是一个行向量)

个人经验:

  1. 首先,熟悉每个变量的记号和维度,必要的话,可以画出来,更直观。
  2. 先从一个样本做向量化,再把m个样本的操作向量化。
  3. for-loop里面是循环乘法,则向量化一定是一个乘法形式,若对于不确定乘法的左右关系,是否需转置,可以根据目标变量的维度推测。或者先乘起来,再根据目标变量看是否要转置。

Vectorizing Logistic Regression’s Gradient Output

推导过程

Screen-Shot-2018-06-09-at-18.35.35

最终向量化的形式是:

\(\frac{\partial J}{\partial w} = \frac{1}{m}X(A-Y)^T\) \(\frac{\partial J}{\partial b} = \frac{1}{m} \sum_{i=1}^m (a^{(i)}-y^{(i)})\)

Broadcasting in Python

在matlab和Python中,都默认支持不同维度的变量做element-wised的计算(+-x/等)。所谓Broadcasting其实就是高纬度数组和低纬度数组计算时,将低维的变量通过复制的方式向高维扩展维度,再做运算。但要注意:

  1. 低纬度数组与高纬度共有的维度,元素个数必须一样,比如一个shape是(5,3)的数组可以和一个shape是(5,)的数组相加,但不能和一个(4,)的数组相加。
  2. 维度相同的数组的数组,是不能broadcasting的,比如一个shape是(5,3)的数组和一个shape是(5,2)的数组运算,后者是无法broadcasting的
  3. 某个维度的个数是1,等同于这个维度不存在,可以broadcasting,比如shape是(5,3)和(5,1)的数组可以运算。

总的来说,就是broadcasting要做某个维度的复制,必须在赋值的时候行得通。比如shape是(5,3)和shape是(5,2)的数组运算,后者要将2复制为3是行不通的,因为存在两行,那取哪一行?

Andrew的一个经验:如果对某个数组的shape不确定,可以用reshape显式的调用一下,确保维度正确。

补充:numpy中,类似sum的函数,经常涉及axis参数,可以取值为0或1,甚至其他。经常记不住,这里我查了了一下,是这样的(原文):

  1. axis的数字,和数组的shape参数的索引是对应的。比如一个数组的shape是(5,6),则代表5个row,6个column。即在shape中,row和column的个数的索引是0和1。也就第1个坐标,在shape中的第一个元素,索引是0,代表row的方向;第2个坐标,在shape中的第2个元素,索引是1,代表row的方向
  2. 对于sum函数,axis指的是sum“沿着”的方向,经过计算,这个方向的维度因为求和后就消失了,比如sum(axis=0)代表是沿着“row”方向进行求和,
  3. 当然axis可以是一个tupe,那就相当于沿着多个多个方向求和。
  4. sum如果不传入axis参数,默认是对所有维度求和。

A note on python/numpy vectors

broadcasting的一个弱点:可能隐藏潜在的错误,比如一个计算中本来要去两个运算的数组维度一样,如果没有broadcasting,就会直接报错;而broadcasting允许可继续执行。

rank 1 array问题:shape是(x,)的数组,既不是行向量,也不是列向量,没法参与正常的矩阵运算,应该总是使用(x,1)或(1,x)的shape来表示向量。但可以通过reshape方法将rank 1 array转换为行向量或列向量。(什么是rank,就是一个数组的维度)

Screen-Shot-2018-06-10-at-18.03.37

Quick tour of Jupyter/iPython Notebooks

这部分,也可以参考我之前的文章:《Jupyter Notebook简介和配置说明

Explanation of logistic regression cost function (optional)

计算结果𝑦̂代表了给定样本x,y=1的概率,即𝑦̂=P(y=1|x)

但为什么可以对应到概率呢?参考:为什么sigmoid可以代表概率,涉及Logistic distribution https://stats.stackexchange.com/questions/80611/problem-understanding-the-logistic-regression-link-function/80623#80623

Loss function其实就是对概率P(y x)取对数:

Screen-Shot-2018-06-10-at-18.28.41

Loss function越小,则取到和实际值y的概率越大。

所有样本的Cost function:

Screen-Shot-2018-06-10-at-18.32.40

Heros of Deep Learning:Pieter Abbeel interview

Screen-Shot-2018-06-10-at-18.34.23

  1. Pieter Abbeel专注于deep reinforcement learning.

  2. advice for people entrying AI
    • A good time to enter AI. High demand.
    • Not just read things or watch videos but try things out.
    • With frameworks like TensorFlow, Chainer, Theano, PyTorch and so forth, it’s very easy to get going and get something up and running very quickly.
  3. Andrew Ng: We live in good times. If people want to learn.

  4. what are the things that deep reinforcement learning is already working really well at?
    • learning to play games from pixels
    • robot inventing walking, running, standing up with a single algorithm.

-------------------------

本文采用 知识共享署名 4.0 国际许可协议(CC-BY 4.0)进行许可。转载请注明来源:https://imshuai.com/deeplearning-ai-notes-course1-week2 欢迎指正或在下方评论。