分享到plurk 分享到twitter 分享到facebook

User/xxiex123

xxiex123(黃凱陽)

簡介:

  • 成功大學 電機工程學系110級(2017-2021)
  • 交通大學 電機所 甲組(2021~ )

聯絡資訊:

  • email: E24065084@gs.ncku.edu.tw

2021春季班 個人評量

(春季班)作業及筆記

(春季班)所見所聞心得

  • 對於硬課:電機系裏硬課很多,而且領域很廣,難就難在對某領域比較不強時,還修他們的硬課,上起來就比他們還困難。而我也做過這種事情,也挺過來了,有種沒什麼困難是花點時間解決不了的想法。一項來選課只選硬課的我,已經知道所謂的硬課的底線是到哪裏了,一直到了大四下,我已經沒什麼場面沒見過,但這堂課例外。對於真正的硬課,有兩種、一種是期末有一個上臺報告的環節,要同學互相評比期末專題,同時上這堂課的人都是有名的卷哥,這種課會因爲不想出糗而努力做好。第二種是這堂課,老師不檔人,但功課量超級多,課程超級難,這種課可以混混過,但就會缺失選硬課的真理(選硬課的目的不就是要學東西?)。對於那種課程內容比較難,作業比較多,還會被檔的課不算硬課,因爲要拿60分並不是難事,只是努力一下而已。而這堂課硬在,1、所有教材放上去自己看,2、作業可以無限優化,一直到改進 linux kernel,3、同學們都是神,覺得自己菜得一批。

  • 擴散型學習:老師說過,現代高度分工的情況,只有專精在一個領域,成爲其中專家才能顯得有用,這句話是事實,但我一項來的學習方法確實背道而馳,我一直不斷修完全不同領域的課,我想要知道各個領域的知識,有幾點原因,一、每個領域裏用到的分析技巧、或是技術,往往會互相借鑑,也就是說在某些地方看過類似的處理某些問題的方法,當我遇到類似的問題時可以用得到。二、電資領域常常互相關聯,某些領域裏,會看到處理一些問題的方法很奇怪,而爲什麼奇怪?其實是因爲關乎其他領域,最直接的比喻是,寫程式考慮到 cache,如若不懂 cache 會根本不知道爲什麼要浪費時間做這些事,也就是說在學習的路程上會變得豁然開朗起來,像是任督二脈打通一樣。三、與其他領域的同學說話,不會因爲不了解而無話可說。四、雖然高度分工的確對擴散型學習方式不友善,但當工作屬於較高層的部分時,爲了管理底下不同領域的團隊,這些片面的知識非常重要。

  • 課程所得:這堂課與絕大部分的課不一樣,不會縱容學生,不會因爲覺得還是學生而寬容一些東西,像是把我們弄在一個工程師的環境做事情,我們必須要適應裏面的職業素養,講話必須要嚴謹,必須要會表達、溝通,作品必須公開以提供需要的人幫助,這些事情在做作業的過程中不斷被磨練。在即將步入研究所的的我,算是提前一步訓練了講話要有水準,不可含糊不定,以及意識到研究成果必須公布於衆,經歷所有人的審核。除此之外,一個很重要的是解決問題要循序渐进,先把最基本的做好,再一步一步觀察哪些是可以優化的,進行改進、實驗、比較,這是我在期末專題學習到的東西,也是我找到了我自身問題的所在,因爲我每次偏向於一次到位,做到最好,但每次都很難前進,很沒成就感,光是這一點我就非常滿意了(這困擾我很久)。

  • 期末專題:在這一個班上我應該算是最差的幾個了,前面的作業一、二搞得我都頭很痛,加上雖然學的是 c++ ,只寫過三次 c 的作業,甚至沒用過 bitwise operation,沒用過真正意義的 linux系統,基礎非常欠缺,前面的作業花了30小時來做,但對比其他同學的就像是在過家家一樣,自信很受損。原本覺得期末專題應該也會一樣讓自己無法滿意,但在利用一周多的時間看教材、背景知識、最佳化手法等,到開始實做,我發現我還是做得下去的,參考了一下去年的同學做的,我開始覺得自己還是可以做到一些事情,於是便開始着手操作。前面的投入非常沉迷,每天幾乎4點睡覺,早上起來繼續寫,我發現這種循序漸進的方法做起來非常爽,不知不覺時間就過去了,就像打遊戲時一樣。一步一步前進,雖然做到目前位置,也還沒什麼大成果,但至少有把東西做出來,並且我知道之後應該怎麼更進一步(只是目前7/2還有一份期末報告),暑假的時候會繼續投入,把它完成得讓人更值得參考一些。

(春季班)自我評量分數 (1 到 10 級分)

5.5級分,前期基於前進龜速與自身惰性,常常停歇,怠慢作業進度,照成作業上面不達標,但在期末專題上開始對這堂課上了軌道。

  1. 知道如何用 bit-wise operator 實作 clz / ctz (count leading/tailing zero) 嗎? 以下是最常用的方式,這種方式特點是計算次數只需 log(bits)次,例如 32 位元的 int 只需做 log 32 = 5次。

int n = 32; unsigned y;

y = x >>16; if (y != 0) { n = n -16; x = y; }

y = x >> 8; if (y != 0) { n = n - 8; x = y; }

y = x >> 4; if (y != 0) { n = n - 4; x = y; }

y = x >> 2; if (y != 0) { n = n - 2; x = y; }

y = x >> 1; if (y != 0) return n - 2;

return n - x;

  1. 知道 fixed point 嗎?相較於 floating point,這樣的機制有何優缺點呢?知道真實世界如何運用嗎? (例如Linux 核心的 CFS)

浮點的特點是能夠移動小數點的位置,從而可以因所要表達的數改變小數點位置來達到更精確表達,定點則是把小數點定死,比如我只用 7 個 bit 來表達小數後的部分,那就 都不會改變了,優點是可以提高計算效率,缺點是表達範圍不大。定點運算現在很常被用在 edge 端的 AI 應用,在 edge 端往往沒有很強的硬體計算資源,因此會把圖片的 pixel 形態改爲 int8 減少計算成本,int8 可表達 0-255 ,例如 00000100 = 4 , 如果變成 fixed point ,假設小數點點在第7位,變成 0.0000100,第一個 bit 是 sign bit,表達正負號 ,因此表達範圍變成 -1 到 1, 而 0.0000100 變成 0.3125,但此結果需要除 2 ,變成 0.0000010 = 0.015625, 爲什麼除2?因 爲我們要把 0 - 255 的範圍,用定點的 0 到 1 去表達,而 -1 到 0 是沒用到的,因此需要除 2 (把 pixel left shift 1)。可能會問,爲什麼要用 0 - 1 表達 而不直接用 0 - 255? 因爲在 AI model 訓練時,input 常常會被 normalize 成 0 - 1,因此當 inference 到應用端時就要想辦法轉換成 0 - 1。能用在 AI 的 應用上是基於神經網絡的一個特點,那就是權重(weight)不需要很精確(符合定點數特性),因爲 AI 是用來預測、辨識等,這些不被要求完全準確的事情。

  1. 本學期課程內容中,讓你印象最深刻、顛覆過往認知的部分是什麼?請舉例說明

有一次上課,我旁邊坐了一位貌似很厲害的同學,但個性好像比較不善交談,當天老師點名同學問測驗題時,依照老師的說法是很看好他,而且他付出的時間也很多,但在回答的 過程中並沒有回答得很好(我並沒有因此覺得他不強,而是每個人的個性問題),重點是說老師下課時間跑來跟他“教導”,然後說要推薦他去 intel 面試,意識到了這是一堂 “只要掌握這一堂課,就能出去工作”的課,也就是說我大學4年用來上這堂課,也許還比上一大堆的課 4 年還來的值得,畢竟 4年專精在一個領域能走很遠。 另外,據說成大有兩門課是上得好就能工作,第一是這一堂,第二是電機所的 VLSI,有幸上到這一堂還是很值得的。