---
# System prepended metadata

title: 明道中學高中部資訊類專題

---


{%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. 深度學習之優點

深度學習相較於其他的機器學習方法，因為在特徵的採取方式上，不須由人工決定、採取，而是交由電腦處理，因此可能找出更多人類看不出來的特徵值。在人工特徵的去除後，也大量降低輸入一單位資料所需要的時間，也就是能輸入更大量的資料，有了更大量的資料就相當於更高精度的學習。也就是說，只要給她足量的資料量，就能夠比其他的方法有更好學習成果。

![](https://i.imgur.com/zoo2YSH.png =500x)

~~(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://i.imgur.com/wBSibyL.png)
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/)

<!-- ## 參、研究方法

### 一、研究架構

![](https://i.imgur.com/L3bP5lA.png)

### 二、研究方法

基於我們的研究方向，我們在理論部分決定由三個人各自學習，將所學製成筆記，並且每周進行一次的知識交流，將我們三人的學習成果統整。

API的實作方面因為只要進行簡單的模型建構來驗證理論結果，因此決定以三人協作的方式完成一個基礎模型。

底層架構的建立由於工作量龐大，因此我們採用分塊分工的方式進行，各自負責一部分的實作最後再將其整合成完整模型。

如果有延展應用面則是回歸API的做法，因為自己寫的底層速度很難負荷更高階的應用，因此我們打算採用API來進行圖像辨識或是更進階的CNN神經網路常見用法。

### 三、研究流程

**順帶一提，我們不會用tensorflow，除非土炮失敗**

![](https://i.imgur.com/6Us5qAK.png) -->
