2015年1月20日 星期二

Machine Learning 0 -- What is SVM?


前面的課程主要是在講SVM(Support Vector Machine),本來這篇兩個禮拜前就應該發的,不過很多事讓我一拖再拖,我希望以後可以以兩個禮拜一篇的速度完成,有點像是自己對這個領域的小筆記。

SVM 是一種 Machine Learning 的演算法,照字面上的意思來看,就是"利用 support vector分類 machine"。
在了解這句話之前,我們先來看一個簡單的圖

取樣資料

一般來說,machine learning 的目的是從取樣資料(手上有的看得到的資料)中預測一個可以描述全域資料(不知道長怎樣,不過大概跟取樣資料長得很像)的方程式 $f(x)$,換句話說$f(x)$是學習的最終目標;以上圖為例,我們可以用任意直線、圓錐曲線甚至是不規則圖形來分開他們,每一個圖形都是一個假說(hypothesis),以$h_i(x)$表示,當我們使用不同的 machine learning 演算法 (或者是使用同一種演算法但不同參數),就是用不同的選妃標準來選擇一個最適合的假說,被挑選出來的妃子假說我們會讓他進化成皇后$g(x)$,$g(x)$就是我們的預測值,我們會希望$g(x)$非常接近世界上最完美的皇后$f(x)$。

圖上的三條線都可以分開兩群資料,所以我們都可以把它們看成假說。

現在我們回到那句話:"SVM 是利用 support vector 來分類的 machine"。SVM 挑選假說的方式就是去尋找 support vector,並且以 support vector 為基準來分類。這句話從字面上完全無法了解它的意函,所以有另外一個比較通俗的說法:

找到一條可以分類的線,而且這條線所在的區域擁有兩群資料間最大的邊界。

找到一條可以分類的線,而且這條線所在的區域擁有兩群資料間最大的邊界。

找到一條可以分類的線,而且這條線所在的區域擁有兩群資料間最大的邊界。

因為很重要所以要說三次

如下圖,如果假說都是直線的話,SVM 就是要找到一條線離左右兩群資料間的區域最大。

中間的區域就像是緩衝區一樣,到左右兩邊的緩衝區越大,就有很大的機會容忍取樣上的誤差。

好啦,現在問題就來了,兩群資料可以分就好幹嘛這麼龜毛,還要找最大的邊界?

其實這很直覺!撇開數學(shatter, vc dimension)不談,要確保 machine learning 出來的結果正確,最重要的就是兩件事,1)取樣的資料要好。2)演算法要挑剔。

對我個人來說,好的取樣資料是最重要的,因為我們不可能把世界上所有的資料都拿來用,所以我們只能取其中有代表性的資料出來算,如果取得不好,就算使用世界 上最強的演算法也算不出符合原始資料的結果。就像是要去分析交大學生的習慣,如果全部都在竹軒、女二舍裡面調查的話,就會有交大是女校的錯覺,在這樣的錯覺下,任何對於此資料做出的分析找到的$g(x)$一定會跟$f(x)$相去甚遠。

不過就算是再好的取樣,取出的資料也不能100%代表著母體,而這時候使用演算法就要特別小心。在 machine learning 裡面,演算法決定了$h_i(x)$的產生方式,以及選擇$g(x)$的標準。如果產生$h_i(x)$的方式不挑剔,不管三七二十一,只要能夠把當前這筆資料完美的處理就好,很容易會學過頭了,也就是說好得學壞得也學,連那些誤差都學得淋漓盡致,一般正式的文章裏面都把這個叫做 over fitting。為了避免 over fitting,最簡單的方式就是對演算法設下條件,而SVM的條件就是,要找最大的邊界。

到這邊就是簡單的 machine learning 以及 SVM 的概念。

2015年1月18日 星期日

SELinux for Android 簡介

最近在看 SELinux for Android 的資料,發現很少中文的解說,所以想說順便整理一篇。

在了解本篇主題以前,可以先了解一下什麼是 SELinux,我建議可以看這篇網誌,解釋得滿清楚的。

再來,這篇主要的內容會是解釋這個投影片, 這是 NSA(美國國家安全局) 對於 SELinux for Android 做的演講。好,正題開始。

SELinux 是要在原本Linux的 DAC (Discretionary Access Control) 上面,加上 MAC (Mandatory Access Control) 的架構。主要的目的是要避免誤用以導致系統損毀,要體驗的話其實很簡單,如果手邊有 root 的 Android 機器的話,可以發現就算用 root 的權限也沒有辦法去修改 system/ 下面的 init*.rc 的檔案內容,這就是因為 SELinux 在作祟擋住了寫入的權限。

platform/external/sepolicy/domain.te
# Nothing should be writing to files in the rootfs.
neverallow { domain -recovery } rootfs:file { create write setattr relabelto append unlink link rename };

上面那段 policy 的目的是在 domain 中除了 recovery 外,使用被標(labeled)成 rootfs 的 檔案(file) 都不被允許(neverallow) 這一長串 { create write setattr relabelto append unlink link rename } 裡面的事情。

再來,我們來看,rootfs 的定義:

platform/external/sepolicy/file_contexts
# Root
/          u:object_r:rootfs:s0
# Data files
/adb_keys               u:object_r:adb_keys_file:s0 #這行不是rootfs
/default\.prop          u:object_r:rootfs:s0
/fstab\..*              u:object_r:rootfs:s0
/init\..*               u:object_r:rootfs:s0
/res(/.*)?              u:object_r:rootfs:s0
/ueventd\..*            u:object_r:rootfs:s0

# Executablesˇ
/charger                u:object_r:rootfs:s0
/init                   u:object_r:rootfs:s0
/sbin(/.*)?             u:object_r:rootfs:s0

# Empty directories
/lost\+found            u:object_r:rootfs:s0
/proc                   u:object_r:rootfs:s0

# SELinux policy files
/file_contexts          u:object_r:rootfs:s0
/property_contexts      u:object_r:rootfs:s0
/seapp_contexts         u:object_r:rootfs:s0
/sepolicy               u:object_r:rootfs:s0
 
也就是說在這些檔案目錄下的東西,都不被允許 { create write setattr relabelto append unlink link rename },所以也沒有辦法在shell底下的根目錄新增檔案。而這就是SELinux的定義,可以避免誤用而導致系統損毀。

在看這些 rule 的時候,主要是看兩種檔案,一種是 *.te ,一種是 *_context。*.te 裡面記載著各種 rule;而 *_context 的目的是把檔案貼標籤 (labeling)。以上面的例子來看,rootfs 這個標籤在 domain.te 裡面,被規定了不能 { create write setattr relabelto append unlink link rename } ,而 rootfs 則是在 file_context 裡面跟真實的檔案目錄連結,只要抓到這個原則就很容易看懂這些 policy 之間的關係。

在 source code 裡面,這些檔案通常會被放在兩個地方:
  1. platform/external/sepolicy
  2. device/<vendor>/<product>/sepolicy 
  platform/external/sepolicy 可ˇ已把它看作是 AOSP 原生的 policy,基本上這些檔案最好不要修改;要修改的話,可以加在 device/<vendor>/<product>/sepolicy 裡面。在 platform/external/sepolicyREADME 有詳細說明該如何修改,說明如下:

Eg.) Suppose the following:
     BOARD_SEPOLICY_DIRS += X Y
     BOARD_SEPOLICY_REPLACE += A
     BOARD_SEPOLICY_IGNORE += X/A

     Directories X and Y contain A.

     The resulting policy is created by using Y/A only, thus X/A was
     ignored.

Example BoardConfig.mk Usage:
From the Tuna device BoardConfig.mk, device/samsung/tuna/BoardConfig.mk

BOARD_SEPOLICY_DIRS += \
        device/samsung/tuna/sepolicy

BOARD_SEPOLICY_UNION += \
        genfs_contexts \
        file_contexts \
        sepolicy.te
 
最後,投影片裡面還有提到, platform/external/sepolicy 裡面大概有哪些檔案。檔案分成:
  • *.te
    • 定義一些全域的 rule: domain.te, app.te
    • 宣告 device 與 file 的 類型 (type): device.te, file.te
    • 單獨的 rule : e.g. installd.te
  • *_context
    •  file_contexts: labeling 檔案目錄
    •  property_contexts: labeling init 裡面的 property
    •  seapp_contexts:
  • mac_permissions.xml
    • 定義特定App的 seinfo,這個 seinfo 會在 seapp_contexs 裡面用到。

 有這些架構的概念以後,應該就可以順利地讀懂延伸閱讀裡面的東西。

延伸閱讀:

2015年1月12日 星期一

工業4.0

今天早上廣播聽到的工業4.0... BMW的7系列 可以在50sec內換線生產... 這就是競爭力!

爬文#1
未來製造它說了算!德國的章魚戰略:工業4.0
http://www.cw.com.tw/article/article.action?id=5063514
台灣真的是... "人口老、勞力少又貴,而市場需求變化快又短"...

爬文#2

WiKi 工業4.0

http://zh.wikipedia.org/wiki/%E5%B7%A5%E6%A5%AD4.0
台灣還有革命嗎?
"「工業4.0」一詞是指第四次工業革命...
第一次工業革命是利用水力及蒸汽的力量作動力源,
第二次工業革命則使用電力為大生產提供動力,
第三次工業革命則是使用電子設備及信息技術(IT)開展自動化的製造。
工業4.0一詞最早是在2011年的漢諾瓦工業博覽會提出[8]。在2012年10月由羅伯特·博世有限公司的Siegfried Dais及德國科學院的Henning Kagermann組成的工業4.0工作小組,向德國聯邦政府提出了工業4.0的實施建議。在2013年4月8日的漢諾瓦工業博覽會中,工業4.0工作小組提出了最終報告[。"