# 第二周：神经网络的编程基础(Basics of Neural Network programming)

## 2.1 Binary Classification

**逻辑回归**模型一般用来解决**二分类（Binary Classification）**&#x95EE;题

二分类就是输出y只有{0,1}两个离散值（也有{-1,1}的情况）

![](https://baozou.gitbooks.io/neural-networks-and-deep-learning/content/assets/18.bmp)

彩色图片包含RGB三个通道。例如该cat图片的尺寸为（64，64，3）

在神经网络模型中，首先要将图片输入x（维度是（64，64，3））转化为一维的**特征向量（featurevector）**。方法是每个通道一行一行取，再连接起来。则转化后的输入特征向量维度为（12288，1）。此特征向量x是列向量，维度一般记为$$n\_x$$

如果训练样本共有m张图片，那么整个训练样本X组成了矩阵，维度是（$$n\_x$$,m),$$n\_x$$代表了每个样本$$X^{(i)}$$特征个数，列m代表了样本个数,输出Y组成了一维的行向量，维度是（1，m）

![](https://baozou.gitbooks.io/neural-networks-and-deep-learning/content/assets/340import.png)![](https://baozou.gitbooks.io/neural-networks-and-deep-learning/content/assets/341import.png)

## 2.2 Logistic Regression

逻辑回归中，预测值$$\hat y=P(y=1 | x)$$表示为1的概率，取值范围在\[0,1]之间

使用线性模型，引入参数w和b。权重w的维度是（$$n\_x$$，1），b是一个常数项

逻辑回归的预测输出可以完整写成：

$$
\hat y = Sigmoid(w^Tx+b)=\sigma(w^Tx+b)
$$

Sigmoid函数的一阶导数可以用其自身表示：

$$
\sigma'(z)=\sigma(z)(1-\sigma(z))
$$

![](https://baozou.gitbooks.io/neural-networks-and-deep-learning/content/assets/342import.png)![](https://baozou.gitbooks.io/neural-networks-and-deep-learning/content/assets/343import.png)

## 2.3 Logistic Regression Cost Function

单个样本的**cost function**用**Loss function**来表示，使用**平方误差（squared error）**：

$$
L(\hat y,y)=\frac12(\hat y-y)^2
$$

逻辑回归一般不使用平方误差来作为Loss function。原因是这种Loss function一般是non-convex的。

non-convex函数在使用梯度下降算法时，容易得到局部最小值（localminimum），即局部最优化。而最优化的目标是计算得到全局最优化（Global optimization），因此一般选择的Loss function应该是convex的

构建另外一种Loss function(针对单个样本)，且是convex的：

$$
L(\hat y,y)=-(ylog\ \hat y+(1-y)log\ (1-\hat y))
$$

当y=1时，$$L(\hat y,y)=-\log \hat y$$，如果$$\hat y$$越接近1，$$L(\hat y,y)\approx 0$$，表示预测效果越好；如果$$\hat y$$越接近0，$$L(\hat y,y)\approx +\infty$$，表示预测效果越差

当y=0时，$$L(\hat y,y)=-\log(1- \hat y)$$，如果$$\hat y$$越接近0，$$L(\hat y,y)\approx 0$$，表示预测效果越好；如果$$\hat y$$越接近1，$$L(\hat y,y)\approx +\infty$$，表示预测效果越差

**Cost function**是m个样本的**Loss function**的平均值，反映了m个样本的预测输出$$\hat y$$与真实样本输出y的平均接近程度:

$$
J(w,b)=\frac1m\sum\_{i=1}^mL(\hat y^{(i)},y^{(i)})=-\frac1m\sum\_{i=1}^m\[y^{(i)}log\ \hat y^{(i)}+(1-y^{(i)})log\ (1-\hat y^{(i)})]
$$

![](https://baozou.gitbooks.io/neural-networks-and-deep-learning/content/assets/344import.png)

## 2.4 Logistic Regression Gradient Descent

对单个样本而言，**逻辑回归Loss function**表达式如下：

$$
z=w^Tx+b
$$

$$
\hat y=a=\sigma(z)
$$

$$
L(a,y)=-(y\log(a)+(1-y)\log(1-a))
$$

![](https://baozou.gitbooks.io/neural-networks-and-deep-learning/content/assets/19.bmp)

计算该逻辑回归的反向传播过程:

$$
da=\frac{\partial L}{\partial a}=-\frac ya+\frac{1-y}{1-a}
$$

$$
dz=\frac{\partial L}{\partial z}=\frac{\partial L}{\partial a}\cdot \frac{\partial a}{\partial z}=(-\frac ya+\frac{1-y}{1-a})\cdot a(1-a)=a-y
$$

$$
dw\_1=\frac{\partial L}{\partial w\_1}=\frac{\partial L}{\partial z}\cdot \frac{\partial z}{\partial w\_1}=x\_1\cdot dz=x\_1(a-y)
$$

$$
dw\_2=\frac{\partial L}{\partial w\_2}=\frac{\partial L}{\partial z}\cdot \frac{\partial z}{\partial w\_2}=x\_2\cdot dz=x\_2(a-y)
$$

$$
db=\frac{\partial L}{\partial b}=\frac{\partial L}{\partial z}\cdot \frac{\partial z}{\partial b}=1\cdot dz=a-y
$$

则梯度下降算法可表示为：

$$
w\_1:=w\_1-\alpha\ dw\_1
$$

$$
w\_2:=w\_2-\alpha\ dw\_2
$$

$$
b:=b-\alpha\ db
$$

![](https://baozou.gitbooks.io/neural-networks-and-deep-learning/content/assets/20.bmp)

## 2.5 Gradient descent on m examples

m个样本的**Cost function**表达式如下：

$$
z^{(i)}=w^Tx^{(i)}+b
$$

$$
\hat y^{(i)}=a^{(i)}=\sigma(z^{(i)})
$$

$$
J(w,b)=\frac1m\sum\_{i=1}^mL(\hat y^{(i)},y^{(i)})=-\frac1m\sum\_{i=1}^m\[y^{(i)}log\ \hat y^{(i)}+(1-y^{(i)})log\ (1-\hat y^{(i)})]
$$

**Cost function**关于w和b的偏导数可以写成和平均的形式：

$$
dw\_1=\frac1m\sum\_{i=1}^mx\_1^{(i)}(a^{(i)}-y^{(i)})
$$

$$
dw\_2=\frac1m\sum\_{i=1}^mx\_2^{(i)}(a^{(i)}-y^{(i)})
$$

$$
dw\_m=\frac1m\sum\_{i=1}^mx\_m^{(i)}(a^{(i)}-y^{(i)})
$$

$$
db=\frac1m\sum\_{i=1}^m(a^{(i)}-y^{(i)})
$$

算法流程如下所示：

```python
J=0; dw1=0; dw2=0; db=0;
for i = 1 to m
    z(i) = wx(i)+b;
    a(i) = sigmoid(z(i));
    J += -[y(i)log(a(i))+(1-y(i)）log(1-a(i));
    dz(i) = a(i)-y(i);
    dw1 += x1(i)dz(i);
    dw2 += x2(i)dz(i);
    db += dz(i);
J /= m;
dw1 /= m;
dw2 /= m;
db /= m;
```

经过每次迭代后，根据梯度下降算法，w和b都进行更新：

$$
w\_1:=w\_1-\alpha\ dw\_1
$$

$$
w\_2:=w\_2-\alpha\ dw\_2
$$

$$
w\_m:=w\_m-\alpha\ dw\_m
$$

$$
b:=b-\alpha\ db
$$

在深度学习中，样本数量m通常很大，使用for循环会让神经网络程序运行得很慢。应该尽量避免使用for循环操作，而使用矩阵运算，能够大大提高程序运行速度

## 2.6 Vectorizing Logistic Regression’s Gradient Output

db可表示为：

$$
db=\frac1m \sum\_{i=1}^mdz^{(i)}
$$

dw可表示为：

$$
dw=\frac1m X\cdot dZ^T
$$

单次迭代，梯度下降算法流程如下所示：

```python
Z = np.dot(w.T,X) + b
A = sigmoid(Z)
dZ = A-Y
dw = 1/m*np.dot(X,dZ.T)
db = 1/m*np.sum(dZ)

w = w - alpha*dw
b = b - alpha*db
```

## 2.7 Explanation of logistic regression cost function(optional)

$$\hat y$$可以看成是预测输出为正类（+1）的概率：

$$
\hat y=P(y=1|x)
$$

当y=1时：

$$
p(y|x)=\hat y
$$

当y=0时：

$$
p(y|x)=1-\hat y
$$

整合到一个式子:

$$
P(y|x)=\hat y^y(1-\hat y)^{(1-y)}
$$

进行log处理：

$$
log\ P(y|x)=log\ \hat y^y(1-\hat y)^{(1-y)}=y\ log\ \hat y+(1-y)log(1-\hat y)
$$

上述概率P(y|x)越大越好，加上负号，则转化成了单个样本的**Loss function**，越小越好:

$$
L=-(y\ log\ \hat y+(1-y)log(1-\hat y))
$$

对于所有m个训练样本，假设样本之间是独立同分布的，总的概率越大越好：

$$
max\ \prod\_{i=1}^m\ P(y^{(i)}|x^{(i)})
$$

引入log函数，加上负号，将上式转化为**Cost function**：

$$
J(w,b)=-\frac1m\sum\_{i=1}^mL(\hat y^{(i)},y^{(i)})=-\frac 1m\sum\_{i=1}^m\[y^{(i)}\ log\ \hat y^{(i)}+(1-y^{(i)})log(1-\hat y^{(i)})]
$$
