### 邏輯迴歸(Logistic Regression)
邏輯迴歸通常用來處理二分類問題。

彩色圖片的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$

### 代價函數(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

因此會構建另一種形式的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$
前向傳播的過程:

反向傳播:
利用chain rule,求$\frac{\partial{J}}{\partial{v}},\frac{\partial{J}}{\partial{a}}....$

### 邏輯迴歸的梯度下降(gradient desent of logistic regression)
從前面的定義:
**$\hat{y}=a=w^T*x+b$**
及
$L(a,y)=-(y*log(a)+(1-y)*log(1-a))$

$\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:


### 淺層神經網路的表示(representation of neural net work)

矩陣$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層
:::
單個節點的情況


在第一層第一個節點中,會進行以下計算:
$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,再進行一次如同前面的運算:

輸出層只有一個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)
使其可以正常運算
:::
小結:

:::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}

### 激活函數(activation functions)(NonLinear)
:::success
> 在類神經網路中使用激勵函數,主要是利用非線性方程式,解決非線性問題,如果不使用激勵函數,類神經網路就會是以線性的方式組合運算,因為隱藏層以及輸出層都是拿上層的結果當作下層的輸入,並以線性組合計算,作為這一層的輸出,使得輸出與輸入只存在著線性關係,而現實中,所有問題皆屬於非線性問題,因此,如果沒有使用非線性之激勵函數,那類神經網路訓練出的模型就失去意義了。
:::
**激活函數種類:**

**sigmoid 除了在二元分類問題上(因為要表示[0,1]的範圍),其餘時候幾乎不會使用。**

**一般會使用tanh 代替sigmoid,它能使output分布在[-1,1]範圍內,平均值接近0。**

**最普遍使用,過濾掉z$\le0$的情況(斜率=0),當z$>0$,斜率統一為1**

**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)