---
# System prepended metadata

title: coursera DL
tags: [智慧運算]

---














































































































































































































































































































































































































































### 邏輯迴歸(Logistic Regression)
邏輯迴歸通常用來處理二分類問題。
![image](https://hackmd.io/_uploads/BJ6iBBnDC.png)
彩色圖片的input:
    一般彩色圖片可以用矩陣表示為[Channel,Height,Width]
* **channel:R,G,B**    eg:R,G,B=3通道
* **Height:高**
* **width:寬度**
而在input前會將[Channel,Height,Width]拉為一維向量
(每一個通道都拉為一維向量後再連接起來。)
連接後會變成1-D column vector x，維度記為$n_x$
假設有m張圖片輸入，則為$(n_x*m)$

在Logistic Regression中，令輸入=x，欲計算$\hat{y}=p(y=1|x)$
$\hat{y}$為機率，$0<\hat{y}<1$，$x\in R^{n_x}$，為$(n_x,1)$的vector
因此可假設一參數$w\in R^{n_x}$，constant $b \in R$
記作:

**$\hat{y}=w^T*x+b$**

因為是0~1之間的機率，所以再加上sigmoid funciton

$\hat{y}=sigmoid(w^T*x+b)$

* $sigmoid =\frac{1}{1+e^{-z}}$
* 把$(w^T*x+b)$當作z
* if z is large,output$\approx1$
* if z is small,output $\approx0$

![image](https://hackmd.io/_uploads/SkVclU2PA.png)


### 代價函數(Cost Function of logistic regression)
==單筆資料==的cost function 通常用lost function表示:
$L(\hat{y},y)=\frac{1}{2}(\hat{y}-y)^2$ or $=(\hat{y}-y)^2$
但因為會變成非凸優化問題(non-convex)，存在多loacal minimum，在梯度下降時不容易求到global minimum
![image](https://hackmd.io/_uploads/BkDLig6vR.png)
因此會構建另一種形式的loss function:
$L(\hat{y},y)=-(y*log(\hat{y})+(1-y)*log(1-\hat{y}))$

而cost function 是多個資料的loss function平均值
$J(w,b)=\frac{1}{m}\sum_{m=1}^{m}-(y_m*log(\hat{y_m})+(1-y_m)*log(1-\hat{y_m}))$
:::warning
**Extra:損失函數的解釋:**
$y=1$的機率
$p(y=1|x)=\hat{y}$
$y=0的機率$
$p(y=0|x)=1-\hat{y}$

可整合成一式:
$P(y|x)=\hat{y}^y*(1-\hat{y})^{1-y}$

加入log:

$logP(y|x)=(y*log(\hat{y})+(1-y)*log(1-\hat{y}))$

加上負號變成loss function，越小越好:

$L(\hat{y},y)=-(y*log(\hat{y})+(1-y)*log(1-\hat{y}))$

在多樣本m的情況會把每個機率視作獨立:
$P'(y|x)=\prod^m_1P(y_i|x_i)$
$log(P'(y|x))=log(P(y_1|x_1))+log(P(y_2|x_2))+log(P(y_3|x_3))...=\sum_{i=1}^m(y_i*log(\hat{y_i})+(1-y_i)*log(1-\hat{y_i}))$

加上負號且取平均為多樣本loss function:
$J(w,b)=-\frac{1}{m}*\sum_{i=1}^m(y_i*log(\hat{y_i})+(1-y_i)*log(1-\hat{y_i}))$
:::


### computing gragh
令一函數:
$J(a,b,c)=3(a+(b*c))$
且設
$u=b*c$
$v=a+u$
$J=3*v$
前向傳播的過程:
![image](https://hackmd.io/_uploads/B1Ucr-Tv0.png)
反向傳播:
利用chain rule，求$\frac{\partial{J}}{\partial{v}},\frac{\partial{J}}{\partial{a}}....$
![image](https://hackmd.io/_uploads/SyaZv-pPC.png)

### 邏輯迴歸的梯度下降(gradient desent of logistic regression)
從前面的定義:
**$\hat{y}=a=w^T*x+b$**
及
$L(a,y)=-(y*log(a)+(1-y)*log(1-a))$
![image](https://hackmd.io/_uploads/S1YKHGpPC.png)

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

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

$\frac{\partial{L}}{\partial{a}}*\frac{\partial{a}}{\partial{z}}*\frac{\partial{z}}{\partial{w_1}}=(a-y)*x_1$
$\frac{\partial{L}}{\partial{a}}*\frac{\partial{a}}{\partial{z}}*\frac{\partial{z}}{\partial{w_2}}=(a-y)*x_2$
$\frac{\partial{L}}{\partial{a}}*\frac{\partial{a}}{\partial{z}}*\frac{\partial{z}}{\partial{b}}=(a-y)*1$


**更新參數 by gradient desent:**
$w_1=w_1-\alpha*(a-y)*x_1$
$w_2=w_2-\alpha*(a-y)*x_2$
$b=b-\alpha*(a-y)$

**當有m筆資料時的梯度下降:**
$\frac{1}{m}*\sum^m_1L(a,y)$
$\Rightarrow\frac{1}{m}*\sum^m_1(\frac{\partial{L}}{\partial{a}}*\frac{\partial{a}}{\partial{z}}*\frac{\partial{z}}{\partial{w_i}})$
$\Rightarrow w_1=w_1-\alpha*\frac{1}{m}*\sum^m_1(a-y)*x_1$
$\Rightarrow  w_2=w_1-\alpha*\frac{1}{m}*\sum^m_1(a-y)*x_2$
$\Rightarrow b=b-\alpha*\sum^m_1(a-y)$

```
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;
```
```
當j個features時:
J=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);
    for(j=0;j<n;j++){    #處理w1,w2,w3...wj
    w(j)+=x(j)(i)dz(i)
    }
    db += dz(i);
J /= m;
dw1 /= m;
dw2 /= m;
db /= m;
```
```
vectorized:
J=0; db=0;
numpy.zeros((j,1))    #j個features
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);
    w+=x*dz(i)    #w & x 都是(j*1)向量
    db += dz(i);
J /= m;
w/=m
db /= m;
```
:::info
note:
當有多筆資料時，將導數總和取平均後用以更新參數，而在取總和時一般會用for loop，但不建議。
當數據量大時，for loop會很沒效率=>vectorization可以解決此問題!善用numpy!!!
:::

### 邏輯迴歸向量化(vectorizing logistic regresstion)
from 前面
**$\hat{y}=w^T*x+b$**
$\hat{y}=sigmoid(w^T*x+b$

$w$可寫為矩陣:
\begin{matrix}
w_1 &   \\
w_2   & \\
w_3 & \\
.&\\
.&\\
\end{matrix}

$x也可用矩陣表示:$

\begin{matrix}
x_1 & x_2&x_3&.&.\\
&
\end{matrix}

$b$矩陣:
\begin{matrix}
b & b&b&.&.\\
&
\end{matrix}

$\hat{Y}=[\hat{y}_1,\hat{y}_2,\hat{y}_3...]$

```
=numpy.dot(w^T,x)+b    #b在numpy中會自動轉成1*m矩陣[b,b,b..]，稱為broadcasting
```


原本:
$J=0; dw1=0; dw2=0; db=0;$
**for i = 1 to m**
    $\qquad z_i = w*x_i+b$
    $\qquad a_i = \sigma(z_i)$
    $\qquad J += -[y_i*log(a_i)+(1-y_i）log(1-a_i)$
    $\qquad dz_i = a_i-y_i$
    $\qquad dw_1 += x_{1i}*dz_i$
    $\qquad dw_2 += x_{2i}*dz_i$
    $\qquad db += dz_i$
$J /= m$
$dw1 /= m$
$dw2 /= m$
$db /= m$

向量化:
$Z=W^T*X+b$
$A=\sigma(Z)$
$dZ=A-\hat{Y}$
$dw=\frac{X*dZ^T}{m}$
$b=\frac{numpy.sum(dZ)}{m}$


$w=w-\alpha*slope$
$b=b-\alpha*slope$

**Extra:python broadcast 機制:**
$principle:$
$\qquad 當(m,n)矩陣與(m,1)矩陣做四則運算，(m,1)會拓展成(m,n)，column \ copy\ n次$
$\qquad 當(m,n)矩陣與(1,n)矩陣做四則運算，(1,n)會拓展成(m,n)，row \ copy\ m次$

example:
![image](https://hackmd.io/_uploads/HJGb8Z4_C.png)
![image](https://hackmd.io/_uploads/SyVZ8-NdR.png)

### 淺層神經網路的表示(representation of neural net work)
![image](https://hackmd.io/_uploads/SkbhPL8u0.png)
矩陣$X=$
\begin{matrix}
x_1 &   \\
x_2   & \\
x_3 & \\
\end{matrix}
為輸入層(input layer)，也稱作第0層，記作$a^{[0]}$

矩陣
\begin{matrix}
a_1 &   \\
a_2   & \\
a_3 & \\
a_4 & \\
\end{matrix}
為隱藏層(hidden layer，也稱作第1層，記作$a^{[1]}$
有參數$W^{[1]},b^{[1]}$    ##==W==
W的維度為(4,3)，4個節點，3個input
b的維度為(4,1)

第二層為單個節點，為輸出層(output layer)$=\hat{y}=a^{[2]}$
有參數$W^{[2]},b^{[2]}$
W的維度為(1,4)
b的維度為(1,1)

:::warning
通常不會將輸入層算入正式層數，所以以上的NN為2層
:::

單個節點的情況
![image](https://hackmd.io/_uploads/HkDfmuIOR.png)
![image](https://hackmd.io/_uploads/By5fQO8u0.png)
在第一層第一個節點中，會進行以下計算:
$z^{[1]}_1=w{^{[1]}_1}^T*X+b_1$
$a^{[1]}_1=\sigma(z^{[1]}_1)$
以此類推，第一層第二個節點:
$z^{[1]}_2=w{^{[1]}_2}^T*X+b_2$
$a^{[1]}_2=\sigma(z^{[2]}_2)$

第一層第三個節點:
$z^{[1]}_3=w{^{[1]}_3}^T*X+b_3$
$a^{[1]}_3=\sigma(z^{[3]}_3)$


$向量a=$
\begin{matrix}
a^{[1]}_1 &   \\
a^{[1]}_2   & \\
a^{[1]}_3 & \\
a^{[1]}_4&\\
\end{matrix}


在第二層中，向量a作為input，再進行一次如同前面的運算:
![image](https://hackmd.io/_uploads/HkkgddIO0.png)

輸出層只有一個z了
$z^{[2]}_1=w{^{[2]}_1}^T*a+b_2$
**final output:**
$a^{[2]}_1=\sigma(z^{[2]}_1)=\hat{y}$


:::warning
這邊的向量a維度為(4,1)，正是對應前面提及第二層中參數w,b的維度(1,4)，可以相乘
:::
然而為了可以再加快計算的效率，可以將以上的式子再向量化:
在第一層中，令向量$W^{[1]}=$
\begin{matrix}
..{w_1^{[1]}}^T.. &   \\
..{w_2^{[1]}}^T..   & \\
..{w_3^{[1]}}^T.. & \\
..{w_4^{[1]}}^T..&\\
\end{matrix}
:::warning
$以上所有w_n^{[1]}為transport過的結果，row\  vector，維度皆為(1,3)
所以$W^{[1]}$是(4,3)的矩陣
:::
$W^{[1]}=(w^T沿row排列)$
\begin{matrix}
{w_1}_1^{[1]} &{w_1}_2^{[1]} &{w_1}_3^{[1]}&  \\
{w_2}_1^{[1]} &{w_2}_2^{[1]}& {w_2}_3^{[1]} & \\
{w_3}_1^{[1]} &{w_3}_2^{[1]} &{w_3}_3^{[1]}&\\
{w_4}_1^{[1]}&{w_4}_2^{[1]}&{w_4}_3^{[1]}&\\
\end{matrix}

乘上input X
\begin{matrix}
&x_1 &   \\
X=&x_2  & \\
&x_3& \\
\end{matrix}

加上b，sigmoid function
結果為(4,1)的矩陣:
\begin{matrix}
\sigma (w_1^{[1]}*x_1+b)=\sigma (z_1) &&  a_1 \\
\sigma (w_2^{[1]}*x_2+b )=\sigma (z_2)  && a_2\\
\sigma (w_3^{[1]}*x_3 +b)=\sigma (z_3) & =&a_3&=a \ \ matrix\\
\sigma (w_4^{[1]}*x_4 +b )=\sigma (z_4)&& a_4\\
\end{matrix}

:::info
這裡的W(4,3)剛好就對應了(該層節點數，input數量)
b(4,1)也對應(該層節點數，1)
使其可以正常運算
:::
小結:
![image](https://hackmd.io/_uploads/S1YmVK8dR.png)
:::danger
$'W'$並沒有transport
:::
#### 多個樣本的向量化(vectorizing across multiple examples)

當有多樣本時，也就是有很多組$X$，通常會把多組$X$沿著column排列成新矩陣以取代for loop迭代。
\begin{matrix}
&x_1 &   \\
X=&x_2  & \\
&x_3 & \\
\end{matrix}
\begin{matrix}
[X_1,X_2,X_3 ...]=X' \\第一個樣本，第二個樣本.....
\end{matrix}
也就是
\begin{matrix}
{x_1}_1 &{x_2}_1 &{x_3}_1&  \\
{x_1}_2  &{x_2}_2&{x_3}_2 & \\
{x_1}_3 &{x_2}_3&{x_3}_3& \\
\end{matrix}

$a=\sigma (W*[X_1,X_2,X_3]+b)$
$\rightarrow \sigma (W*X'+b)$


\begin{matrix}
[a_1,a_2,a_3 ...]=A\ matrix \\第一個樣本的a，第二個樣本的a.....
\end{matrix}
\begin{matrix}
{a_1}_1 &{a_2}_1 &{a_3}_1&  \\
{a_1}_2  &{a_2}_2&{a_3}_2 & \\
{a_1}_3 &{a_2}_3&{a_3}_3& \\
{a_1}_4 &{a_2}_4&{a_3}_4& \\
\end{matrix}

在輸出層:
\begin{matrix}
{W^{[2]}}*[a_1,a_2,a_3 ...]+b^{[2]} \\
={W^{[2]}}*A+b^{[2]}\\
{W^{[2]}}=(1,4) \ matrix\\
A=(4,3) \ matrix\\
\end{matrix}

最後output:
\begin{matrix}
[a'_1,a'_2,a'_3 ...]=A'\ matrix(1,3) \\第一個樣本的result，第二個樣本的result.....
\end{matrix}
![image](https://hackmd.io/_uploads/BkHqETUOC.png)


### 激活函數(activation functions)(NonLinear)
:::success
> 在類神經網路中使用激勵函數，主要是利用非線性方程式，解決非線性問題，如果不使用激勵函數，類神經網路就會是以線性的方式組合運算，因為隱藏層以及輸出層都是拿上層的結果當作下層的輸入，並以線性組合計算，作為這一層的輸出，使得輸出與輸入只存在著線性關係，而現實中，所有問題皆屬於非線性問題，因此，如果沒有使用非線性之激勵函數，那類神經網路訓練出的模型就失去意義了。
:::
**激活函數種類:**
![image](https://hackmd.io/_uploads/HJ_8BeOu0.png)
**sigmoid 除了在二元分類問題上(因為要表示[0,1]的範圍)，其餘時候幾乎不會使用。**
![image](https://hackmd.io/_uploads/r1m0re_OC.png)
**一般會使用tanh 代替sigmoid，它能使output分布在[-1,1]範圍內，平均值接近0。**
![image](https://hackmd.io/_uploads/B1HLUgudR.png)
**最普遍使用，過濾掉z$\le0$的情況(斜率=0)，當z$>0$，斜率統一為1**
![image](https://hackmd.io/_uploads/rJVB_xd_0.png)
**leakey ReLU可以解決ReLU中當z$\le0$時的問題**

:::success
不同layer ==可以==用不同的activation funtion喔
:::

**激活函數求導數:**
$sigmoid:$
$\qquad \qquad  g(z)=\frac{1}{1+e^{-z}}$
$\qquad \qquad \frac{d}{dz}\frac{1}{1+e^{-z}}=g(z)*(1-g(z))$

$tanh:$
$\qquad \qquad g(z)=\frac{e^z-e^{-z}}{e^z+e^{-z}}$
$\qquad \qquad \frac{d}{dz}\frac{e^z-e^{-z}}{e^z+e^{-z}}==1-g(z)^2$

$ReLU:$
\begin{cases}
g(z)=0 \ \ \ \ if\ z<0 \\
g(z)=z \ \ \ \ if \ z>=0\\
\end{cases}
\begin{cases}
g'(z)=0 \ \ \ \ if\ z<0 \\
g'(z)=1 \ \ \ \ if \ z>=0\\
\end{cases}
$leaky ReLU:特指z>0時0.01$
\begin{cases}
g(z)=0.01z \ \ \ \ if\ z<0 \\
g(z)=z \ \ \ \ if \ z>=0\\
\end{cases}
\begin{cases}
g'(z)=0.01 \ \ \ \ if\ z<0 \\
g'(z)=1 \ \ \ \ if \ z>=0\\
\end{cases}

ref:
[非凸優化non-convex](https://www.796t.com/content/1543908005.html)
[CS230 sheet](https://stanford.edu/~shervine/teaching/cs-230/)
[deep_learning AI books](https://github.com/fengdu78/deeplearning_ai_books/tree/master)
[resource](https://communeit.medium.com/%E5%8F%B2%E4%B8%8A%E6%9C%80%E5%85%A8%E7%9A%84-ai-%E5%AD%B8%E7%BF%92%E8%B7%AF%E7%B7%9A-%E9%99%84%E8%B3%87%E6%BA%90%E9%80%A3%E7%B5%90%E6%95%B4%E7%90%86-b3f270e0639d)
[Activation Functions — Sigmoid & ReLu & tahn & LeakyReLu & ELU](https://medium.com/@adea820616/activation-functions-sigmoid-relu-tahn-20e3ae726ae)


    
    