### 邏輯迴歸(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)