星期五。見面

程式 | 學習 | 日記 | 玩樂

    [論文速速讀]系列文章介紹

前言

論文速速讀系列是從今年四月開始,我開始寫一些論文的中文讀書筆記,還記得第一篇是[論文速速讀]ReZero is All You Need: Fast Convergence at Large Depth,之後發現儘管自己已經陸續產出了幾篇文章,可是好像都沒正式的跟大家介紹這系列文章的由來xD

所以這篇文章就是來講講這系列文章到底是什麼,以及我會和會想寫這些文章。

論文速速讀系列是什麼?

由於在AI領域每年總是有一些非常重大的突破和應用,如果跟不上潮流很有可能就會錯失許多機會。例如,對NLP領域熟悉的話你一定聽過2013年的word2vec、2014年開始流行的attention、2018年的Bert…這些很有名的技術。

還記得Bert剛出的時候我好像剛進碩士實驗室,當時只知道這個技術屌打了當時一堆NLP的研究,但我想也想不到兩年後Bert已經造成如此大的影響力,一堆基於Bert的變形應用在各大領域上都取得了非常優異的結果。

因此,我想要藉由這系列的文章讓自己能夠更加快速的了解AI的新技術和研究,同時逼迫自己看論文xD

繼續閱讀

    [課程筆記]課程筆記系列總覽

本文記錄了自己在上課時所記錄的一些課程筆記,可以透過這邊文章連結到所有以往發過的課程筆記文章。

繼續閱讀

Neural Networks API Introduction: Android APP背後是如何執行一個神經網路模型的?

前言

本篇是對於官方文檔Neural Networks API的中文閱讀筆記,內容是閱讀後透過自己的理解重新撰寫的,所以不全然是文檔的翻譯內容。

Android Neural Networks API

一個深度學習的應用分成兩個階段

  • training phase 訓練階段: 大部分的人都會在server上訓練好自家的深度學習模型(不會在手機上訓練,是想訓練多久…)
  • inference phase 推論階段: 將訓練好的模型拿來進行推論的應用,此時模型根據scenario就有可能放在手機、IOT device這些小型裝置,而不是將資料送到server上做再拿回來(因為這樣會有很高的latency)

為什麼要在device端做推論? 當然也可以把資料傳到server上推論完在下載回來,但這樣會衍生出一些問題:

  • Latency: 儘管server端的運算速度快很多,但資料傳送之間的I/O會造成很大的延遲,尤其對於一些real time的應用至關重要
  • Availability: 在沒有網路的地方就無法將資料上傳到server計算
  • Speed: 現在的行動設備上有越來越多支持深度學習運算的特化晶片,使得行動端的推論計算效率也大大提升,也逐漸能cover目前的edge ai application
  • Privacy: 對於一些有隱私議題的應用來說,將資料上傳到server並不是一個好選擇,此時在local端自己處理資料匯市比較好的解決方案
  • Cost: 使用行動端裝置自己處理推論,省掉了許多額外的成本(例如server的費用)
繼續閱讀

[Linux Kernel慢慢學]快速上手Makefile和Kbuild Makefile

前言

Linux Kernel中是透過Kbuild Makefile(Kernel build, 基於makefile的compile tool)來對kernel code編譯,然後最終產生vmlinux file。所以了解Kbuild是很重要的,在看一個kernel code的時候可以透過Makefile file來幫助了解編譯的架構構成。

要了解Kbuild Makefile就要知道什麼是Makefile,但是Makefile細節太多了,講不完齁

詳細完整的教學網路上很多了,所以這篇文章不講瑣碎的原理跟細節,而是試著從實際看code會看到的內容來介紹:

  1. 快速介紹Makefile的概念,我們只講重點
  2. 快速介紹Kbuild規則,我們只講重點和常會用到的部分
  3. 搭配kernel code來實際看一下例子
繼續閱讀

[Linux Kernel慢慢學]define macro with hashtag("#" and "##")

前言

這篇的標題定的很…白話(?) 主要是在看Linux kernel code的時候有時候常常會看到一堆define,有些define還會搭配井字號的寫法還會讓你很看不懂,所以重新寫一個小短篇順便幫自己複習一下。

然後井字號這種特殊符號又很難去search,所以標題就決定也這樣下,不知道未來遇到同樣問題的人搜尋起來會不會比較容易xD

來個小測驗,如果你覺得你夠懂#define了,下面這段Linux kernel code你看得懂嗎?

/* include/linux/init.h. line=172 */
#define __define_initcall(fn, id) \
static initcall_t __initcall_##fn##id __used \
__attribute__((__section__(".initcall" #id ".init"))) = fn;

比較陌生的應該是跟井字號的用法(# 和 ##),他們其實被稱作Preprocessor operators

所以這篇一開始會快速介紹define macro,接下來開始介紹和Preprocessor operators的搭配,對這部分有興趣的可以直接看最後一Part。

繼續閱讀

[論文速速讀]ILSVRC系列文回顧 - 歷屆CNN模型介紹

〖想觀看更多中文論文導讀,至[論文速速讀]系列文章介紹可以看到目前已發布的所有文章!〗

前言 - ILSVRC系列文的里程碑

在10月底的論文速速讀中終於完成了SENet的中文論文導讀,該篇也是ILSVRC系列的最後一篇了(因為最後一屆舉辦就是2017年)。

這些知名的模型其實在碩士修課的時候就都學過了([DL]淺談CNN在Object Classification上的各種架構),但一直都沒有完整的看過每一篇論文。畢業之後想通過規劃一系列的文章來逼自己看論文,也透過這一系列的論文筆記幫助對深度學習有興趣的朋友。

「為什麼要浪費時間把每篇都看一次? 知道怎麼用不就好了嗎?」

可能有人會這麼想,不過我認為每個模型的發展都有它背後要解決的問題,模型比別人好也有其原因,看完這一系列的文章後希望讀者可以對於要用什麼模型來處理自己的任務比較有概念。

而未來如果需要進一步去設計屬於自己的模型的時候,也期望這系列的文章也能夠讓你更加了解應該要如何設計,例如隨插隨用的Inception block, ResNet block, SE block是什麼…又應該怎麼把這些模塊融入自己的設計模型中,預期能為自己的模型達到什麼樣的效果。

繼續閱讀

[Linux Kernel慢慢學]Different betweeen ioctl, unlocked_ioctl and compat_ioctl

前言

會寫這一篇主要是自己在看一些網路教材的時候如果有些資源比較久你就會發現他用的還是ioctl()接口,但如果你實際上去碰新版的Kernel時卻發現了這個接口卻不見了,但卻多出了unlocked_ioctl()compat_ioctl()這兩個很類似的function,然後就好奇他們到底差在哪裡、要怎麼用,學習完後就打了這篇文章做個記錄。

這篇文章就是對ioctl()unlocked_ioctl()compat_ioctl()三個做一個簡單的介紹,讓大家更能夠知道應該如何使用和區分他們。

(以下linux source code如果沒有特別提及版本,接以v4.1.14為主)

ioctl是什麼?

ioctl()是撰寫driver一個很重要的接口,以字元裝置驅動(char device driver)來說,透過這個接口可以讓user來操作driver執行一些行為。

在撰寫driver code時,我們必須透過register_chrdev()來向kernel註冊我們的driver。為此我們需要提供該driver的file_operation相關函數實作來讓user可以透過這些接口來操控該driver。

在/include/linux/fs.h中可以看到file_operations的結構定義:

1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
/* include/linux/fs.h, line=1588 */
struct file_operations {
struct module *owner;
loff_t (*llseek) (struct file *, loff_t, int);
ssize_t (*read) (struct file *, char __user *, size_t, loff_t *);
ssize_t (*write) (struct file *, const char __user *, size_t, loff_t *);
ssize_t (*read_iter) (struct kiocb *, struct iov_iter *);
ssize_t (*write_iter) (struct kiocb *, struct iov_iter *);
int (*iterate) (struct file *, struct dir_context *);
unsigned int (*poll) (struct file *, struct poll_table_struct *);
long (*unlocked_ioctl) (struct file *, unsigned int, unsigned long);
long (*compat_ioctl) (struct file *, unsigned int, unsigned long);
int (*mmap) (struct file *, struct vm_area_struct *);
int (*mremap)(struct file *, struct vm_area_struct *);
int (*open) (struct inode *, struct file *);
int (*flush) (struct file *, fl_owner_t id);
int (*release) (struct inode *, struct file *);
...
};

常見需要實現的pointer to function包含open(), read(), write(), close(), ioctl()…等,細節的部份我先不提。

主要來看ioctl()這件事,上面是4.14版本的code,看了一下的code發現並沒有我說的ioctl(),反而出現了unlocked_ioctl()compat_ioctl(),到底發生了什麼事情呢?

繼續閱讀

[論文速速讀]Squeeze-and-Excitation Networks

〖想觀看更多中文論文導讀,至[論文速速讀]系列文章介紹可以看到目前已發布的所有文章!〗

前言

paper: https://arxiv.org/pdf/1709.01507.pdf

SENet,也就是ILSVRC 2017年的冠軍,是由自駕車公司Momenta所提出,撰寫這篇的同時也為ILSVRC的中文論文導讀系列畫下了一個句點(因為2017是ILSVRC的最後一屆)。

SENet的精神是提出了一個隨插隨用的SE block,讓你可以很沒節操的到處插入別人家的模塊中。使得model能夠針對每一層的channel產生了類似注意力機制的學習機制,廢話不多說,開始來看看SENet做了什麼事情吧!

繼續閱讀

>