分類

展開全部 | 收合全部

分類

展開全部 | 收合全部

【Google ML】17 – Lesson 3 – 多維度線性回歸解(N-D Regression), 交叉熵(cross-entropy)與均方差(MSE) 作為誤差函數計算所帶來的不同

今天的內容會很數學……不過我盡量試著用自己的方式講的比較簡單一點了,
裡面附帶一點我自己比較ㄎㄧㄤ的理解方式,但不一定完全正確就是XD,
希望大家能比較舒服的看完比較數學的這部分(?)

前言

我們繼續新課程 Launching into Machine Learning 的第二章~

這幾天的文章會是一系列的,會需要一起看才比較能看懂整個ML模型的輪廓,
然而因為一天能寫的內容量有限,所以我會在前言部分稍微說明我寫到哪。

複習一下ML的整個訓練過程

因為ML模型的訓練階段章節內容會分很多部分,我們要先確認好自己在哪個階段,
以免吸收新內容卻不知道用在內容的什麼地方。

★ML的整個「訓練過程」:這裡以監督式學習(Supervised Learning)為例

階段要做的事情簡介
(訓練前)決定資料集與分析資料你想要預測的是什麼資料? 這邊需要先知道 examplelabelfeatures的概念。介紹可參考:【Day 15】,而我們這次作為範例的訓練資料集介紹在【Day 19】
(訓練前)決定問題種類依據資料,會知道是什麼類型的問題。regression problem(回歸問題)? classification problem(分類問題)? 此處可參考:【Day 16】、與進階內容:【Day 17】
(訓練前)決定ML模型(ML models)依據問題的種類,會知道需要使用什麼對應的ML模型。回歸模型(Regression model)? 分類模型(Classification model)? 此處可參考:【Day 18】神經網路(neural network)? 簡介於:【Day 25】
(模型裡面的參數)ML模型裡面的參數(parameters)超參數(hyper-parameters) 此處可參考:【Day 18】
(訓練中) 調整模型評估當前模型好壞損失函數(Loss Functions):使用損失函數評估目前模型的好與壞。以MSE(Mean Squared Error), RMSE(Root Mean Squared Error), 交叉熵(Cross Entropy)為例。此處可參考:【Day 20】
(訓練中) 調整模型修正模型參數梯度下降法 (Gradient Descent)為例:決定模型中參數的修正「方向」與「步長(step size)」此處可參考:【Day 21】
(訓練中) 調整腳步調整學習腳步透過學習速率(learning rate)來調整ML模型訓練的步長(step size),調整學習腳步。(此參數在訓練前設定,為hyper-parameter)。此處可參考:【Day 22】
(訓練中) 加快訓練取樣與分堆設定batch size,透過batch從訓練目標中取樣,來加快ML模型訓練的速度。(此參數在訓練前設定,為hyper-parameter)。與迭代(iteration),epoch介紹。此處可參考:【Day 23】
(訓練中) 加快訓練檢查loss的頻率調整「檢查loss的頻率」,依據時間(Time-based)步驟(Step-based)。此處可參考:【Day 23】
(訓練中) 完成訓練(loop) -> 完成重覆過程(評估當前模型好壞 -> 修正模型參數),直到能通過「驗證資料集(Validation)」的驗證即可結束訓練。此處可參考:【Day 27】
(訓練後)訓練結果可能問題「不適當的最小loss?」 此處可參考:【Day 28】
(訓練後)訓練結果可能問題欠擬合(underfitting)?過度擬合(overfitting)? 此處可參考:【Day 26】
(訓練後)評估 – 性能指標性能指標(performance metrics):以混淆矩陣(confusion matrix)分析,包含「Accuracy」、「Precision」、「Recall」三種評估指標。簡介於:【Day 28】、詳細介紹於:【Day 29】
(訓練後)評估 – 新資料適用性泛化(Generalization):對於新資料、沒看過的資料的模型適用性。此處可參考:【Day 26】
(訓練後)評估 – 模型測試使用「獨立測試資料集(Test)」測試? 使用交叉驗證(cross-validation)(又稱bootstrapping)測試? 此處可參考:【Day 27】
(資料分堆的方式)(訓練前) 依據上方「模型測試」的方法,決定資料分堆的方式:訓練用(Training)、驗證用(Validation)、測試用(Test)。此處可參考:【Day 27】

Course – Launching into Machine Learning

第二章節的課程地圖:(紅字標記為本篇文章中會介紹到的章節)
* Practical ML
* Introduction to Practical ML
* Introduction
* Supervised Learning
* Supervised Learning
* Regression and Classification
* ML History
* Short History of ML: Linear Regression
* Short History of ML: Perceptron
* Short History of ML: Neural Networks
* Short History of ML: Decision Trees
* Short History of ML: Kernel Methods
* Short History of ML: Random Forests
* Short History of ML: Modern Neural Networks
* 討論提示: Modern Neural Networks
* Module Quiz


Regression and Classification

課程地圖
* Practical ML
* Supervised Learning
* Regression and Classification

0. 一樣也先來個小整理,不過今天還有其他內容哦

★ 均方差(mean squared error) 與 交叉熵(cross-entropy) 的比較

常用的計算誤差方法均方差(mean squared error)交叉熵(cross-entropy)
使用問題種類regression problem(回歸問題)classification problem(分類問題)
訓練目標最小化「均方差」最小化「交叉熵」
一維畫線(解)依據只要能使最小距離就好(平方最小)線畫下去就是要分好兩類資料,不可以有人跑錯邊(誤差會指數成長)
我自己的理解方式(不完全正確)計算距離,所以不管在線的哪邊沒差,離線平均都近一點就能最小惹分類正確沒事,分類錯誤非常完蛋!!! 只要有分錯邊,誤差瘋狂上升

1. 「結構化」資料 與 「非結構化」資料

今天我們先討論一下昨天來不及討論的「資料」部分,
我們之前所看到的表格資料我們都可以稱之為「結構化」的資料,
-> 自己的註:也就是「有行有列有數據的表格」都可以算。

「結構化」資料是最常見的ML資料類型。

對比「結構化」資料,自然就有「非結構化」資料,
-> 例如:圖片、音樂、影片…… 都屬於非結構化資料。

稍微想一下應該就會知道… 這些資料應該都沒有直接的「數據」好分析吧(?)

https://ithelp.ithome.com.tw/upload/images/20190916/20120424i5urxrcRc1.png

我們來看一下上圖,上圖是一個有關出生率的公開資料(BigQuery中找得到)
我們來思考一個問題:我們能不能預測嬰兒什麼時間會出生?
老樣子,我們還是把該確定的東西確定一下,
* 預測的目標label:嬰兒出生的時間(週)
* 參考的依據features:我們這邊可以選擇媽媽的年齡、體重的變化…
* 因為嬰兒出生的時間是連續值,所以這是個regression problem

接下來,我們可以很容易的對 BigQuery 下 SQL select 找出你要的資料,
這樣你的ML準備的資料就齊全了。

由「結構化」資料預測事情是非常平常且頻繁的,而且也比較容易完成。

https://ithelp.ithome.com.tw/upload/images/20190916/20120424wJSMnqkdUD.png

我們再看一個例子,我們可以更清楚「結構化」資料的方便性。

我們當然也可以用這表格來預測其他事情。
例如,如果我們想預測嬰兒的體重呢?
* 預測的目標label:嬰兒的體重
* 參考的依據features:除了嬰兒體重之外的資料皆可以作為參考
* 因為嬰兒的體重是連續值,所以這是個regression problem

這樣的預測可以幫助醫院提早診斷新生兒會不會有體重過輕的可能,
可以提早替嬰兒準備恆溫箱等等相關的準備,因此能夠預測嬰兒的體重十分重要。

2. 思考問題

https://ithelp.ithome.com.tw/upload/images/20190916/20120424AXfI2WAtoM.png

Q:對於這個資料集,你覺得他會適合用「linear regression(線性回歸)」還是「linear classification(線性分類)」分析?

答案是,兩個都很適合!

我們來思考一下為什麼,我們仔細觀察這個資料的分布,
如果我們先拿掉資料的顏色與類別(class),沒有任何幫助我們理解數據的線,如下圖

https://ithelp.ithome.com.tw/upload/images/20190918/20120424FsrSRCev5R.png

這個資料感覺可以用兩條斜線可以貫穿其中,
而線旁上下的偏移點可以視為雜訊(noise),
只要能這樣判斷,基本上他就是個很適合用linear regression分析的例子。

我們想預測的值是Y,我們替這張圖加了一些不同的顏色與形狀,
使這個數據的結果明顯的呈現兩條線的分佈,
兩條線有不同的斜率與截距、而這兩條線的noise又各自有不同的標準差。

https://ithelp.ithome.com.tw/upload/images/20190918/20120424zCm0DwJxbr.png

我們將我們所預測的線真的加進圖中,我們可以更明顯感覺到他們的線性關係,即使有些小雜訊(noise),這些線就是能使用linear regression作為分析的證明。

2.1 一維的線性回歸 linear regression

我們先看一維linear regression的分析結果,我們添加一條綠線,
這條綠線表示我們剛剛所認定的藍線與紅線的linear equation(線性組合)

也就是 「藍線」與「紅線」 可以組合成 「綠線」。 (經過一些數學運算)
例如: A(ax+b) + B(cx+d) = ex+f 的感覺 <- 我盡力表達線性組合的概念了XD

注意:這條綠線不管是離 class A 或 class B 皆有段距離。

https://ithelp.ithome.com.tw/upload/images/20190916/20120424VLIoF76pFP.png

這條綠線,換個角度說,我們也可以說他將整個空間分佈成兩等分。

原因是因為我們經由回歸計算,我們就是在做「最小化均方差」的損失,
假使我們計算正確,兩個類別(class)對於這條線應該會有相等的拉力,
也就是在這時我們可得到均方差(mean squared error)最小值,
大約會使他們的平均值等距。
註:前面的課程有提到linear regression的學習目標就是在做「最小化均方差」,如果忘記可以回前面章節看

因為每個類別(class)有不同的斜率與截距,比起對整體做linear regression
我們對於個別兩個類別(class)做linear regression效果應該會更好,
也許就是我們這裡所繪製的藍線與紅線。

★ google講到這邊沒有做一個小結,我自己稍微做點小結論:

這邊自己稍微解釋一下,linear regression基本上是預測一條線,
使我們能依照「一個」feature(X)去做結果的預測label(Y),
(這裡要特別強調「一個feature」,因為等等二維就不是一個了)
也就是遵照這條線的規則,因此我們能得到預測答案,
目前我們會依照我們所有可參考的東西,依照綠色線的預測說是我們預測的結果。
但很明顯的,如果可以用兩條線(藍線與紅線)來做預測,預測誤差一定會小更多。

2.2 二維的線性回歸 2D linear regression

剛剛我們做了一維的線性回歸,現在我們來做看看二維的線性回歸:

二維的線性回歸,也就是說我們不再只依靠一個feature去預測label
也就是不再只靠X去計算出Y,
這裡我們使用兩個feature,「X」 與 「資料所對應的class」,去預測「Y」

「資料所對應的class」,我們先下個他在圖上的定義:
* 如果該資料屬於A類別,他的特徵值就是1
* 如果該資料屬於B類別,他的特徵值就是0

所以我們就可以畫出下面這張圖:

https://ithelp.ithome.com.tw/upload/images/20190916/20120424il5OAX6qWI.png

二維的線性回歸(2D linear regression)結果,
不會再是一條「線」,而是由線變成了「平面」。

老樣子我們還是確認一下我們現在的資料:
* 我們想預測的目標label:Y
* 我們作為參考的依據features有兩個,X 和 class

兩組不同的數據之間形成了一個平面
這兩組數據現在因為有多了一個類別(class)的維度而分開,
我們把最適合 A class 與 B class 的線加入圖中(紅藍線),
我們也一併把一維的線性回歸結果線(綠線)也畫進圖中,

注意:這個平面並沒有包含上面所說的任何一條線
因為資料的雜訊(noise)使這些線傾斜於這個平面,
反過來說,如果沒有這些雜訊(noise),這三條線應該會完美的皆在這平面上。

★ google講到這邊沒有做一個小結,我自己稍微做點小結論:

二維的線性回歸(2D linear regression)解從「線」,變成了「平面」,
換句話說,我們提供兩種features(X 和 class),能得到一個預測結果label(Y),
數學上空間中的平面只要給其中兩點,就可以找到剩下一點,所以我們說解是「平面」。
.
這個解答比一維的線性回歸好非常多,還記得我們在一維線性回歸得到的答案「綠線」,
不管怎麼看都與所有的資料點有段距離嗎?
我們甚至還說,如果可以用「藍紅線的兩種線性解」分別表示答案,還能得到比「綠線」更好的預測
.
那為什麼這個二維的線性回歸解答比較好?
因為這個平面找得到的Y,離實際上真實資料點超近啊!(點到平面的直線距離)
你可能會問為什麼?
因為這題目需要參考兩個參數(X 和 class)能有更好的預測結果(Y),
舉例子就是:a+b=c,但我今天只給a,要預測c多少…
不是不能預測(至少我們還掌握一半的關鍵a),只是誤差很多而已嘛…..XD
.
當然很多情況當然可能參考更多的參數,也就是更多的features能做到更好的預測
那就是更高維的線性回歸問題了 。

2.3 線性分類 linear classification

我們的思考問題還沒有討論完呢XD,
既然我們都說不管是「linear regression(線性回歸)」還是「linear classification(線性分類)」都很適合分析,那當然我們也要解釋為什麼linear classification線性分類也適合。

但說到這,相信讀者應該也知道答案了,在剛剛的分析中,我們可以看到「線性回歸」所畫出來的線,
也替我們做了一個非常好的資料分離,所以自然這問題使用linear classification(線性分類)也很合適。

但我們想討論的是,這條一維的線性回歸最佳解,
會恰好等於我們的linear classification(線性分類)問題的最佳決策邊界嗎?

自己的註:決策邊界昨天有提過,簡單來說就是可以區分兩類別(class)的決定線

我們以一維線性分類器所計算出來的結果,劃出圖上的黃線。

https://ithelp.ithome.com.tw/upload/images/20190916/20120424rIbVu2NnRT.png

-> 注意:我們可以發現黃線非常接近綠線,但不完全等於

想想看為什麼會這樣呢?

答:因為計算誤差方式的不同,也可以說是最小化誤差的目標不同。

我們直接搬之前我做的表好了XD

問題種類regression problem(回歸問題)classification problem(分類問題)
答案(label)特性預測的答案(label)為「連續」值預測的答案(label)為「非連續」值
利用資料的方式我們使用數學函數組合不同的features,預測出一個「連續函數」作為我們結果的label我們用features創造一個抉擇邊界,這個邊界幫助我們區分(分類)出結果label
訓練目標最小化「預測的結果」與「實際的結果(label)」的誤差最小化「誤分類(misclassification)」的數量,也就是「預測的分類」與「實際上的分類(label)」的誤差要為最小。
常用的計算誤差方法均方差(mean squared error)交叉熵(cross-entropy)
學習類型監督式學習(Supervised Learning)監督式學習(Supervised Learning)

注意到「回歸問題」與「分類問題」學習目標是不同的嗎?
* 分類問題的訓練目標是「最小化交叉熵(cross-entropy)
* 而回歸問題的訓練目標是「最小化均方差(mean squared error)

而這兩個計算誤差的差別…先不講太深的數學,
但簡單的來說,均方差(mean squared error)存在兩次處罰(quadratic penalty)的計算,
他在算實際點(label)與我們預測點(prediction)的歐氏距離(euclidean distance),
並試著將這距離最小化

就先簡單理解,他有平方嘛,平方不就誤差被放大(更小)了嗎? <- 至少我先這樣簡單理解XD

分類問題所使用的交叉熵(cross-entropy),
* 實際分類(label)與我們預測分類(prediction)結果相同,處罰會線性的成長(等於幾乎沒差)
* 如果實際分類(label)與我們預測分類(prediction)是相反的,處罰會指數性的成長

我是理解成,才這麼簡單分成兩類而已?! 你對了就沒事,你錯了你就超級完蛋!!! <- 至少我是先這樣理解XD

所以我們可以仔細看看剛剛的圖,我們分類問題的決策邊界線感覺更在綠色的上面一點,
為什麼? 因為你看綠色線上有些紅點資料正在上面,
綠線上也有些紅點的雜訊(noise)分佈,甚至有些紅點還越線跑到綠色那邊?!?!
照我們剛剛上面的結論 (或者用我的理解也好XD),

我大分類問題使用交叉熵(cross-entropy),你對沒事,你錯你就超級完蛋!!!!
我怎麼可能允許你在我分界上? 還甚至是越界!!! 不可能!!!

數學一點的講法就是,這個越界造成了非常大的誤差!!!
會違背我們的學習目標「最小化交叉熵(cross-entropy)」

而對於線性回歸(linear regression)來說,雖然誤差是二次方的,
(二次方也表示,你在線的這側或對側,只要距離一樣對我來說意義都一樣(平方嘛)。)

只要「距離盡可能的小」,就可以滿足線性回歸的學習目標「最小化均方差(mean squared error)」

不過最後我們還是要提到,這個資料集,
不論使用linear regression或linear classification來分析皆非常適合,
不同於我們之前所預測的 tips 和 bills 的那個資料集(前面章節提過那個),
這問題反而只適用linear regression,不然就是非線性的分類 non-linear classification。


本文同步發佈在: 第 11 屆 iT 邦幫忙鐵人賽
【Day 17】 Google ML – Lesson 3 – 多維度線性回歸解(N-D Regression), 交叉熵(cross-entropy)與均方差(MSE) 作為誤差函數計算所帶來的不同


參考資料

⭐Google Machine Learning 相關文章整理⭐:
1.訂閱課程【Google ML】1 – Google ML – 參賽原因 與 就先從認識 coursera 與訂閱課程開始第一天吧
⭐ML 基礎知識篇⭐:
1.基礎ML知識什麼是ML? 為什麼ML最近才紅起來? 可參考:【Day 3】
2.設計ML問題如何設計一個ML問題?可參考:【Day 4】
3.ML與一般算法比較比較一般算法與ML算法,看出ML的優勢。可參考:【Day 11】
⭐ML 應用策略篇⭐:
1.ML的成功策略使用ML要成功,常需要的關鍵策略。可參考:【Day 5】
2.ML各階段與比重分配企業運行ML時,在ML的各階段應該放的比重與心力。可參考:【Day 6】
3.ML失敗的常見原因大部分企業使用ML卻失敗的前十大主因。可參考:【Day 6】
4.企業如何引入MLML在企業運行的五大階段與注意事項。 可參考:【Day 7】
⭐GCP 認識篇⭐:
1.在GCP上運行ML的階段在GCP上運行ML大概有哪五大階段? 可參考:【Day 2】
2.GCP上ML的介紹GCP上ML的介紹。可參考:【Day 8】【Day 11】
3.已訓練好的ML模型已訓練好的ML模型。建議可直接使用,不需要再自己訓練。如:Vision API(圖片辨識), Video intelligence API(影片辨識), Speech API(語音辨識), Translation API(語言翻譯), Natural Language API(自然語言處理)。介紹:【Day 4】詳細整理與比較:【Day 12】lab實作:【Day 14】
⭐GCP 上的 lab 實作篇⭐:
1.Lab 事前準備Lab 0 – 在GCP上開始lab前的事前準備與注意事項。可參考:【Day 9】
2.GCP上使用 VMLab 1 – 在GCP上分析地震資料與製圖,並儲存在雲端。可參考: 【Day 10】
3.BigQuery 與 DatalabLab 2 – 使用 BigQuery 與 Datalab 視覺化分析資料。可參考:【Day 13】
4.google ML APIsLab 3 – 使用google已訓練好的ML模型進行實作。如:Vision API(圖片辨識), Video intelligence API(影片辨識), Speech API(語音辨識), Translation API(語言翻譯), Natural Language API(自然語言處理)。可參考:【Day 14】
⭐ML中的不同學習種類⭐:
1.【Day 15】 監督式學習(Supervised Learning) 與 非監督式學習(Unsupervised Learning) 的介紹和比較
⭐訓練「一個」ML模型⭐:
(這裡以 監督式學習(Supervised Learning) 為例)
1. (訓練前)決定資料集與分析資料你想要預測的是什麼資料? 這邊需要先知道 example、label、features的概念。介紹可參考:【Day 15】而我們這次作為範例的訓練資料集介紹在:【Day 19】
2. (訓練前)決定問題種類依據資料,會知道是什麼類型的問題。regression problem(回歸問題)? classification problem(分類問題)? 此處可參考:【Day 16】與進階內容:【Day 17】
3. (訓練前)決定ML模型(ML models)依據問題的種類,會知道需要使用什麼對應的ML模型。回歸模型(Regression model)? 分類模型(Classification model)? 此處可參考:【Day 18】神經網路(neural network)? 簡介於:【Day 25】
4.(模型裡面的參數)ML模型裡面的參數(parameters)與超參數(hyper-parameters) 此處可參考:【Day 18】
5. (訓練中) 調整模型評估當前模型好壞損失函數(Loss Functions):使用損失函數評估目前模型的好與壞。以MSE(Mean Squared Error), RMSE(Root Mean Squared Error), 交叉熵(Cross Entropy)為例。此處可參考:【Day 20】
6. (訓練中) 調整模型修正模型參數以梯度下降法 (Gradient Descent)為例:決定模型中參數的修正「方向」與「步長(step size)」此處可參考:【Day 21】
7. (訓練中) 調整腳步調整學習腳步透過學習速率(learning rate)來調整ML模型訓練的步長(step size),調整學習腳步。(此參數在訓練前設定,為hyper-parameter)。此處可參考:【Day 22】
8. (訓練中) 加快訓練取樣與分堆設定batch size,透過batch從訓練目標中取樣,來加快ML模型訓練的速度。(此參數在訓練前設定,為hyper-parameter)。與迭代(iteration),epoch介紹。此處可參考:【Day 23】
9. (訓練中) 加快訓練檢查loss的頻率調整「檢查loss的頻率」,依據時間(Time-based)與步驟(Step-based)。此處可參考:【Day 23】
10. (訓練中) 完成訓練(loop) -> 完成重覆過程(評估當前模型好壞 -> 修正模型參數),直到能通過「驗證資料集(Validation)」的驗證即可結束訓練。此處可參考:【Day 27】
11. (訓練後)訓練結果可能問題「不適當的最小loss?」 此處可參考:【Day 28】
12. (訓練後)訓練結果可能問題欠擬合(underfitting)?過度擬合(overfitting)? 此處可參考:【Day 26】
13. (訓練後)評估 – 性能指標性能指標(performance metrics):以混淆矩陣(confusion matrix)分析,包含「Accuracy」、「Precision」、「Recall」三種評估指標。簡介於:【Day 28】詳細介紹於:【Day 29】
14. (訓練後)評估 – 新資料適用性泛化(Generalization):對於新資料、沒看過的資料的模型適用性。此處可參考:【Day 26】
15. (訓練後)評估 – 模型測試使用「獨立測試資料集(Test)」測試? 使用交叉驗證(cross-validation)(又稱bootstrapping)測試? 此處可參考:【Day 27】
16.(資料分堆的方式)(訓練前) 依據上方「模型測試」的方法,決定資料分堆的方式:訓練用(Training)、驗證用(Validation)、測試用(Test)。此處可參考:【Day 27】
⭐從所有ML模型的訓練結果中,找到「最好的」ML模型⭐:
( 原因:「訓練好一個模型」不等於「找到最好的模型」 )
1.(訓練模型)【Day 27】 使用「訓練資料集(Training)」訓練模型(調整參數),也就是「上方表格」在做的內容
2.(結束訓練)【Day 27】 訓練到通過「驗證資料集(Validation)」結束訓練(未達到overfitting的狀態前)
3.(模型再調整)【Day 27】 超參數(hyperparameters)調整或神經網路的「layer數」或「使用的node數」(一些訓練前就會先決定的東西)
4.(loop)【Day 27】 (模型再調整)後,重複上述(訓練模型)、(結束訓練),完成訓練新的模型
5.(找到最佳模型)【Day 27】 從「所有訓練的模型」中,找到能使「驗證用資料集(Validation)」最小的loss,完成(找到最佳模型)
6.(決定是否生產)【Day 27】 可以開始決定要不要將此ML模型投入生產。此時我們可以使用「獨立測試資料集(Test)」測試? 使用交叉驗證(cross-validation)(又稱bootstrapping)測試?
⭐訓練 ML 模型的小實驗⭐:
1.【Day 24】 TensorFlow Playground 的簡介與介面介紹
2.【Day 24】 learning rate 的改變對訓練過程的影響
3.【Day 25】 使用神經網路(neural network)分類資料
4.【Day 25】 觀察batch size如何影響gradient descent
⭐30天內容回顧與課程索引, 參賽心得, 未來計畫與感謝⭐:
1.【Google ML】30 – 30天內容回顧與課程索引, 參賽心得, 未來計畫與感謝
⭐【喜歡我的文章嗎? 歡迎幫我按讚~ 讓基金會請創作者喝一杯咖啡!
如果喜歡我的文章,請幫我在下方【按五下Like】 (Google, Facebook 免註冊),會由 「LikeCoin」 贊助作者鼓勵繼續創作,讀者們「只需幫忙按讚,完全不用出錢」哦!

likecoin-steps
Howard Weng
Howard Weng

我是 Howard Weng,很多人叫我嗡嗡。這個網站放了我的各種筆記。希望這些筆記也能順便幫助到有需要的人們!如果文章有幫助到你的話,歡迎幫我點讚哦!
另外,因為定位是「個人的隨手筆記」,有些文章內容「⚠️可能我理解有誤⚠️」或「?只寫到一半?」,如果有發現這樣的情況,歡迎在該文章的最下面留言提醒我!我會儘快修正或補上!感謝大家的建議與幫忙,讓網站能變得更好?

文章: 890

★留個言吧!內容有誤或想要補充也歡迎與我討論!