{%hackmd v3AIxodHR4GD1WLHUov2zg %} # 明道中學高中部資訊類專題 ![p-4]() ## 專題製作計劃書 ![p-7]() ## 題目 : Re0 從0開始的AI實作 <div center> 組長 | 陳茗祐 91XJ30 -|- 組員 | 邱繼叡 91XC13 | 邱繼叡 91XC13 </div> ![p-10]() ## 壹、前言 ### 一、研究動機 機器學習的演算法早在1980年代就已經被提出,不過在現在紅極一時的AI為什麼在過去沒有大爆發呢?難道是因為以前的人們沒有足夠創意與野心進軍AI領域嗎?我想過去的人們也一直渴望著能夠運用AI創造科技奇蹟吧,不過限於電腦算力的不足,他們只能懷著夢想卻無法實現。而今日,硬體技術的增長,讓一切變得可能,站在技術大爆炸的奇點上的我們,遇上的是不可多得的機會。在各家媒體的報導下,對於AI人工智慧這個詞我們已經是見怪不怪,不過對她的印象也僅僅停留在片面的崇拜。而讓我們了解這個機會,並嘗試去鑽研的當屬我們在一年級寒假共同參與的AI營隊,在那個營隊中,類科普式的教學使我們發現人工智慧的有趣之處,基礎的理論探討也讓堅信自己是有能力鑽研這個領域的,再加上科技潮流所帶來的效應,三方面的誘因構成了我們在專題研究選擇AI領域的契機。 因此,我們決定在專題研究中,一探這號稱能夠顛覆未來的新科技。其中它的範圍包羅萬象,令我們難以抉擇。因為我們的一個想法,“既然要研究,就從最基底做起,當我們能從0開始構出,我們就完全學會這項技能了!”,所以最後我們以"不用API來建構CNN神經網路"作為我們的研究主題 ### 二、研究目的 因為對於人工智慧的好奇,我們學習了一些理論相關的東西,而此次研究最終目的,是為了讓我們在理論上的學習有實踐的空間,並且藉著底層實做,能夠更透徹的理解CNN在運作上的東西,以變未來在進行相關應用面的專案時,能夠針對其進行最適合的改善 希望能夠利用rust語言。利用其高速且編譯上安全的特性建構CNN底層。高速方面減少我們對優化的知識不足造成的學習速度拖慢。安全方面防止我們在codin時做出的不當行為。在建構出底層之後,嘗試以之進行最基礎的CNN訓練,並測試在不同優化的方法下,能夠帶來何種效能提升。 ## 貳、文獻探討 ### (一) 人工智慧 1. 人工智慧運算概念 機器學習是人工智慧的分支之一,包含深度學習(Machine Learning)和人工腳本等統計分析方法,泛指所有可以以現有資料晚成這定目標的電腦程式 2. 深度學習之學習方式 ```flow s=>start: 放入資料 p1=>start: 卷積層 p2=>start: ANN神經網路 e=>end: 輸出資料 s->p1->p2->e ``` - 人工腳本 腳本理論認為人決策時都遵從一定原則,如:工作會使人難過,透過人工編寫腳本加入嘗試性的判斷,使腳本具有基礎的判斷能力。 - 機器學習 - 深度學習 透過模擬生物神經元的工作原理,加上大量的訓練資料,模擬生物的思考,進而使機器具有基礎的判斷能力。 - 統計 運用常見的統計方法... 4. 深度學習之優點 深度學習相較於其他的機器學習方法,因為在特徵的採取方式上,不須由人工決定、採取,而是交由電腦處理,因此可能找出更多人類看不出來的特徵值。在人工特徵的去除後,也大量降低輸入一單位資料所需要的時間,也就是能輸入更大量的資料,有了更大量的資料就相當於更高精度的學習。也就是說,只要給她足量的資料量,就能夠比其他的方法有更好學習成果。  ~~(Source: Andrew Ng)~~ 5. 基礎機器學習運作流程 $input : {\bf x} \subseteq X$ $output : y \subseteq Y$ $X$生成$Y$ : $X \rightarrow Y$ target function : $f : X \rightarrow Y(ideal, unknow)$ data : $D = \{ ({\bf x_1},y_1),({\bf x_2},y_2)...({\bf x_N},y_N) \}$ hypothesis : $h:X \rightarrow Y$ hypothesis set : $H = (h_1,h_2,h_3...)$ best hypothesis(練出的最佳模型) : $g:X \rightarrow Y (learned \ to \ be \ used), g \subseteq H$ algorithm : $A$ $A$ take $D$ and $H$ to get $g$  https://www.youtube.com/watch?v=nQvpFSMPhr0&list=PLXVfgk9fNX2I7tB6oIINGBmW50rrmFTqf&index=1 ### (二) 矩陣數學&向量微分 1. 矩陣 用來儲存神經網路權重以及神經元輸入輸出值的東西,用來進行矩陣微分可以讓我們找到ANN神經網路中更好的權重。 2. 向量微分 用來找到ANN神經網路的方向倒數以及梯度,並且透過找到的梯度進行梯度下降算法,已找到誤差值盡量小的梯度。 ### (三) CNN 1. 卷積層 透過卷積核心的運算,放大取得資料的的特徵值,並且從中直接取得特徵值作為神經網路的輸入值,進行訓練 2. ANN神經網路 透過神經網路的訓練,其中的激勵函數可以讓神經元激發的結果圓滑化,以達到非線性、更接近輸入資料的圓滑分區線。而整體網路透過反向傳播更新ANN的權重,已做到訓練的結果。 另外,ANN的一些架構可以使其減弱雜訊造成的影響,讓訓練結果可以更加精準。 ## 三、研究架構 ### 研究方法 我們希望從底層開始建構CNN神經網路,把有關AI學得更為透徹。不過在建構底層前的前置目標,我們自許將所有相關的理論都學成,並解利用這些知識使用Rust做出可以運作的模型,在進階至探討底層的構成,最後也希望能藉此延伸建出更多層面的應用。綜上所述,我們所希望達到的目標大致可分為 ### 研究流程 一、探討CNN神經網路相關的所有構成理論 二、將理論整理成文獻式的資料以供程式方面運作時的查閱 三、利用rust建構出基本的CNN模型 四、針對底層的各個部份進行拆解式的一一建構 五、合併已建構的完成的部分,變成可運作之CNN神經網路 六、進行延伸的應用 ## 肆、工作計劃 ### 工作分配 組員 | 專長 | 工作分配 -|-|- 陳茗祐 91XJ30 | 程式設計、創意 | 專案管理 邱繼叡 91XC13 | 創意、程式設計 | 管理專案 邱繼叡 91XC13 | 程式設計、分析 | 規劃專案 ### 預定進度表(甘特圖) 周|1|2|3|4|5|6|7|8|9|10| -|-|-|-|-|-|-|-|-|-|- 擬定專題題目 | V | | | | | | | | | | 擬定專題計畫草案 | V | | | | | | | | 專題計畫:「前言」 | | V | | | | | | 專題計畫:「文獻探討」 | | | V | | | | | 專題計畫:「研究架構」 | | V | | | | | | 專題計畫:「工作計劃」 | | | V | | | | | 專題計畫:「預期成果」 | | | V | | | | | 專題計畫:「結論」 | | | V | | | | | 彙整專題計劃書上傳 | | | V | | | | | 學習矩陣 | V | | | | | | | 學習自動微分 | V | | | | | | | 學習ANN | V | | | | | | | 學習PLA | V | | | | | | | 學習梯度下降法 | | V | | | | | | 學習激勵函數 | | V | | | | | | 學習捲積 | | | V | | | | | 學習向量 | | | V | | | | | 學習張量 | V | | | | | | | 學習rust | V | | | | | | | 學習成本函數 | V | | | | | | | 實作marco | | | |V | | | | 二次除錯 | | | | | | | | 延展、更新 | | | | | | | | 專題計畫:「前言」 | | | | | | | V | | 專題計畫:「文獻探討」 | | | | | | | | V| 專題計畫:「研究架構」 | | | | | | | V | | 專題計畫:「工作計劃」 | | | | | | | | V| 專題計畫:「預期成 | | | | | | | | | V | | 專題計畫:「結論」 | | | | | | | | | V | | 彙整專題計劃書上傳 | | | | | | | | | V | | 成果發表ppt上台報告 | | | | | | | | | | V| 成果發表投影片操控 | | | | | | | | | | V| 成果發表攝影 | | | | | | | | | | V | 成果發表拍照 | | | | | | | | | | V | 完成百分率 | | | | | | | | <!--第一次ppt上台報告 | | | | | | | | 第一次ppt投影片操控 | | | | | | | | 第一次ppt攝影 | | | | | | | | 第一次ppt拍照 | | | | | | | |--> <!--第二次ppt上台報告 | | | | | | | | 第二次ppt投影片操控 | | | | | | | | 第二次ppt攝影 | | | | | | | | 第二次ppt拍照 | | | | | | | | --> <!-- 第三次ppt上台報告 | V | | | | | | | 第三次ppt投影片操控 | V | | | | | | | 第三次ppt攝影 | | | | | | | | 第三次ppt拍照 | | | | | | | | --> <!-- 第四次ppt上台報告 | | | | | | | | 第四次ppt投影片操控 | | | | | | | | 第四次ppt攝影 | | | | | | | | 第四次ppt拍照 | | | | | | | | 第五次ppt上台報告 | | | | | | | | 第五次ppt投影片操控 | | | | | | | | 第五次ppt攝影 | | | | | | | | 第五次ppt拍照 | | | | | | | | --> ### 軟硬體設備需求表 - 電腦 - Raspberry Pi 4 model B (8GB) - PCIE 3.0 x1 to x16 - 支援CUDA 1.13.1的顯示卡(Nvidia Kepler) - 軟體 - CUDA C developer toolkits - Go lang - Rust - WASM - linux - docker - GRPC - GUN compiler - Visual Studio Code ## 伍、預期成果 ### 一、專題製作成果 - 數學運算的macro(rust) - 基於SDG的ANN - 基於SDG的CNN macro範例(片段)(自己打的) ```rust= #[proc_macro_attribute] pub fn ad(attr:TokenStream,input:TokenStream)-> TokenStream { dbg!(ad::parse(attr,input)) } pub struct Parser<T> where T: Iterator<Item = fn(Skip<token_stream::IntoIter>) -> usize>, { register: Vec<fn() -> bool>, ast_tree: T, } impl<T> Parser<T> where T: Iterator<Item = fn(Skip<token_stream::IntoIter>) -> usize>, { pub fn parse(&self, input: TokenStream) -> Result<T, ()> { let (mut offset, max) = (0, input.into_iter().count().clone()); loop { let mut n; for f in self.ast_tree.into_iter() { n = f(input.into_iter().skip(offset)); if n != 0 { offset += n; break; } } // return if we hit the end of the input.into_iter() // that means no one match the token_stream if n==0 { break Err(()); } // all token_stream be parsed if offset >= max { break Ok(self.ast_tree); } } } } ``` #### github - [project(private)]() - [repository(private)]() ### 二、專題製作過程之學習成果 - 學習矩陣 - 學習自動微分 - 學習ANN - 學習PLA - 學習梯度下降法 - 學習激勵函數 - 學習捲積 - 學習向量 - 學習張量 - 學習成本函數 - Rust <!-- - Rust - 相較於其他語言的優勢 - 速度 - 底層語言 - 安全性 - 可預防不預期之行為 (編譯時檢查) - 自訂義解析器 (macro) - 易除錯性 - 人造神經網路 (ANN) - AI 的基本結構 - 激勵函數 (Activation Function) - 在神經網路的架構下,一般的輸入輸出相當於激活函數為($f(x) = x$),輸出輸入將會呈正比關係,也就是線性,也就是只能夠解決線性的問題,不過我們機器學習應用的範圍常常是非線性的,因此我們利用非線性方程式解決非線性問題。 - 特性 - 非線性 - 引進激活函數就是為了非線性的特性 - 可微分 - 因為我們的機器學習理論是基於梯度的改變,因此函數可微分才能做到 - 單調性(重要但非必要) - 當函數保持單調性時,我們才能有更穩定的梯度,而不是訓練點跟雲霄飛車一樣飛來飛去。 - 常見的激勵函數 - Sigmoid - Tanh - ReLU - 反向傳播 (Backpropagation) - 修正權重影響 ANN 的結果 - 成本函數 (Cost Function) - 量化誤差值 - 隨機梯度下降法 (SGD) - 牛頓法解複雜函式最低點 - 自動微分 (Automatic Differentiation) - 大幅減少微分的計算時間 - 卷積神經網路 (CNN) - 圖像辨識的基礎 - 使用共同特徵 - 減少神經網路的負擔 - 保留大部分資料特徵 - 捲積核 (kernel) - 歷原圖片,將其卷積化 - 權重初始化 (Weight Initialization) - He - 搭配 激勵函式 (Activation Function) - RELU 使用,避免梯度消失 - 相較於其他激勵函數的優勢 - 速度 - 梯度不易消失 --> ## 六、參考文獻 - 高中生也看得懂 機器學習的數學基礎 - 學AI真簡單(I):初探機器學習-從認識AI到Kaggle競賽 - 學AI真簡單(II):動手做深度學習-揭開神經網路的面紗 - 再強一點:用Go語言完成六個大型專案 - C++程式設計第三版 - [build artificial neural network scratch part 1](https://www.kdnuggets.com/2019/11/build-artificial-neural-network-scratch-part-1.html) - [機器/深度學習-基礎數學(二):梯度下降法(gradient descent) | by Tommy Huang | Medium](https://chih-sheng-huang821.medium.com/%E6%A9%9F%E5%99%A8%E5%AD%B8%E7%BF%92-%E5%9F%BA%E7%A4%8E%E6%95%B8%E5%AD%B8-%E4%BA%8C-%E6%A2%AF%E5%BA%A6%E4%B8%8B%E9%99%8D%E6%B3%95-gradient-descent-406e1fd001f) - [機器/深度學習-基礎數學(三):梯度最佳解相關算法(gradient descent optimization algorithms) | by Tommy Huang | Medium](https://chih-sheng-huang821.medium.com/%E6%A9%9F%E5%99%A8%E5%AD%B8%E7%BF%92-%E5%9F%BA%E7%A4%8E%E6%95%B8%E5%AD%B8-%E4%B8%89-%E6%A2%AF%E5%BA%A6%E6%9C%80%E4%BD%B3%E8%A7%A3%E7%9B%B8%E9%97%9C%E7%AE%97%E6%B3%95-gradient-descent-optimization-algorithms-b61ed1478bd7) - [自动微分(Automatic Differentiation)简介_CarlXie-CSDN博客_自动微分](https://blog.csdn.net/aws3217150/article/details/70214422) - [Backpropagation | Brilliant Math & Science Wiki](https://brilliant.org/wiki/backpropagation/) - [Backpropagation](http://galaxy.agh.edu.pl/~vlsi/AI/backp_t_en/backprop.html) - [[機器學習ML NOTE]SGD, Momentum, AdaGrad, Adam Optimizer | by GGWithRabitLIFE | 雞雞與兔兔的工程世界 | Medium](https://medium.com/%E9%9B%9E%E9%9B%9E%E8%88%87%E5%85%94%E5%85%94%E7%9A%84%E5%B7%A5%E7%A8%8B%E4%B8%96%E7%95%8C/%E6%A9%9F%E5%99%A8%E5%AD%B8%E7%BF%92ml-note-sgd-momentum-adagrad-adam-optimizer-f20568c968db) - [backpropagation - Error function in Artificial Neural Network trained using backpropogation - Stack Overflow](https://stackoverflow.com/questions/22601258/error-function-in-artificial-neural-network-trained-using-backpropogation) - [自動微分](http://fancyerii.github.io/books/autodiff/) - [梯度](https://www.youtube.com/watch?v=npkl19rcpdY) - [方向導數](https://www.youtube.com/watch?v=-DumtBiW4HE) - [Machine Learning Foundations (機器學習基石) - YouTube](https://www.youtube.com/playlist?list=PLXVfgk9fNX2I7tB6oIINGBmW50rrmFTqf) - [Backpropagation calculus | Chapter 4, Deep learning](https://www.youtube.com/watch?v=tIeHLnjs5U8) - [為什麼需要反向傳播(裡面有圖解)](https://allen108108.github.io/blog/2020/06/01/%E7%82%BA%E4%BB%80%E9%BA%BC%E9%9C%80%E8%A6%81%E5%8F%8D%E5%90%91%E5%82%B3%E6%92%AD%20_%20Why%20Backpropagation%20_/) - [Kohonen Networks]() - [NVIDIA DOCUMENTATION CENTER](https://docs.nvidia.com/) - [Rust 程式設計語言](https://rust-lang.tw/book-tw/) <!-- ## 參、研究方法 ### 一、研究架構  ### 二、研究方法 基於我們的研究方向,我們在理論部分決定由三個人各自學習,將所學製成筆記,並且每周進行一次的知識交流,將我們三人的學習成果統整。 API的實作方面因為只要進行簡單的模型建構來驗證理論結果,因此決定以三人協作的方式完成一個基礎模型。 底層架構的建立由於工作量龐大,因此我們採用分塊分工的方式進行,各自負責一部分的實作最後再將其整合成完整模型。 如果有延展應用面則是回歸API的做法,因為自己寫的底層速度很難負荷更高階的應用,因此我們打算採用API來進行圖像辨識或是更進階的CNN神經網路常見用法。 ### 三、研究流程 **順帶一提,我們不會用tensorflow,除非土炮失敗**  -->
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up