[ML] Back propagation 推導

我們來推導一下 Back propagtion 的公式,
首先先設想一個只有兩層的 Neural network 如下:



從上圖我們先列出公式如下:

Z = a * W'
hx = sigmoid( Z )

由前面的經驗我們可以得到,
當我們要對 W 進行更新來最小化分類誤差時, 使用 Gradient descent 來更新 W.

那麼如何求出 W 的 Gradient 呢?
我們可以把這個式子使用連鎖律展開!

第一個跟你的Cost function直接相關的是 output layer (a)
而 a 又是經過 sigmoid (z) 得到的
那 z 就可以跟Wij扯上關係啦!
這樣就可以把式子展開如下:

第一層的微分項, 也就是你的 Cost function 對 prediction value 微分, 可以得到 (y - a)
第二層的微分項, 可以得到 a * (1-a)
第三層的微分項則是可以得到再上一層的output layer a

那麼如果再看到上一層的 Wij 呢?
我們看到回到上述第三層的 partial z 部分, 我們知道它是由前一層的 a * Wij 來的,
所以我們在這邊使用連鎖律再把它展開, 可以得到下面的式子

 

依此類推就可以得到每一層權重 W 的 gradient 項了~

[OPENCV] FaceDectection - (二) 深入研究

深入研究演算法

為了能夠即時地計算出Face, 使用了三個的方式來達到目的
1. Integral Image
2. AdaBoost
3. Cascade filter

Integral Image - 積分圖

當計算一個圖像當中某個區域的積分

按照正常的方法, 開始累加每一點的值

這樣子計算量跟所要計算的區域成正比, 如果是一個 NxN的圖案, 那麼複雜度會是 O(N^2)
integral image提供了一種方式可以將計算複雜度簡化到一個常數 O(c)
怎麼做到的呢?

[OPENCV] FaceDetection - (一) 初步探索


Face Detection Example

今天喵把課題提升到 FaceDetection的 Level
感覺FaceDetection是個非常高深的題目
不過, 使用了openCV所提供的 library, 喵一下子就做到了臉部偵測~
主程式為
int main(int argc, char** argv) {

  // Load preconstructed classifier
  face_cascade.load("data/haarcascade_frontalface_alt.xml");
  Mat inputImage = imread(argv[1]);
  detectFaces(inputImage);
  waitKey(0);
  return 0;
}

[ML] 想到就寫 - Octave 的眉眉角角 (一) 用 index 取值?

先拋開 Octave, Machine Learning 這些學問,
我們用 Word 或是 Excel 這些文書處理軟體工作的時候, 一般習慣把資料做下列樣子的編排:

No.HeightWeightAge
11708030
21757035
=> 以資料的"內容物來說" (我們去掉標題跟No.), 這是一個 2 x 3 的矩陣,
表示有2筆資料, 而每一筆的元素有3個.

我們用 Octave 儲存資料的時候, 令 T 等於上述這個 2 x 3 的表格,
使用 T(1, :) 可以取出第一行的資料 (Row = 1, Colume = 1~3)
T(1, :) == T(1, 1:3) => [170, 80, 30]

但是, 使用T(1:3) 的話會取出甚麼?
T(1:3) => [170, 175, 80]

 何...だと...!!

在Octave裡面, 預設的處理方式都是以向量 (Vector) 的形式來呈現,
所以用 sum 來加總上面的 T 表格時, 你會得到 [345 150 65]
=> 對每一個 Column 做 Summation
(從資料的形式來看, 同屬一列 Column 的單位也都會是相同的, 所以這個操作其實蠻合理的)

所以在取一個陣列的值的時候, 盡量避免直接用 index 的方式來拿取,
還是乖乖地使用陣列的表示法吧!

Example. 對表格T進行正規化:

取得每一個 Column 的 mean:
    meanT = sum(T) ./ size(T,1) ==> mean(T)

取得每一個 Column 的 variance
    varT = sum((T - meanT).^2) ==> var(T)

取得每一個 variance 的平方根
    sqrtT = varT .^ 0.5 ==> sqrt(T)

進行正規化:
nT = (T - meanT) ./ sqrtT

OpenGL 閱讀筆記 (二) OpenGL基本操作

這邊虎喵跳過glfw/glew的初始化, 先來提一下OpenGL的基本操作方式 前面也提到過, OpenGL是一個類C的語言, 因此使用C/C++的攻城獅們應該會感到很熟悉. OpenGL的基本動作循環如下: 每一行code的解釋如下: // 本地變數,...