人工神經網絡其實就像是一個複雜的計算器,你給它輸入一些東西,它就能給你一個結果。就像你用計算器輸入2+2,它會給你輸出4一樣,但人工神經網絡能處理的不僅僅是數字加減,它能處理更複雜的東西,比如圖片、文字等等。所以,當我們說人工神經網絡是一個“函數逼近器”時,其實就是說它能模拟各種複雜的計算過程,幫助我們從輸入得到想要的輸出。
如果是一張汽車的圖片,必須有一個函數,可以接收這張圖片并預測它是什麼類型的車,僅僅通過那些原始的像素值。
對于傳統編程,如果有一段英文文本,必須有一個函數,可以接收這段文本并輸出相同的文本,但是用中文。
如果你有一個問題,必須有一個函數,可以産生答案。
但問題是,在傳統編程中,我們一直在編寫函數,它們非常強大,但當函數太難以至于我們無法解釋它時會發生什麼?例如,當你看到這個數字時,
你知道它是5,但如果你必須編寫一個算法,接收這張圖片并說它是5,突然之間這變得極其困難。
任務很簡單,但接收一張手寫數字的圖片并輸出是哪個數字的函數非常難以編寫,所以這就是為什麼我們需要機器學習。這裡的想法很簡單,如果你知道一定存在一個可以解決這個問題的函數,但我們不知道那個函數是什麼樣子的,也許我們可以定義一個結構,一個人工神經網絡,它可以學習這個函數,而為了學習這個函數,它需要一些可以學習的東西,這意味着它需要數據,比如很多不同的手寫數字圖片。
讓我們看一個非常簡單的例子,
你可以看到一些數據點,如果我問你模拟這些數據的函數是什麼,你可能會想象一條穿過這些數據點的曲線。這就是神經網絡也應該學習的,它應該學會逼近這些數據所代表的函數,如果出現了一個新的x值,我們應該能夠預測y值,即使我們之前不知道這個點。
回到手寫數字,一個非常著名的手寫數字數據集叫MNIST,其中存儲了成千上萬個手寫數字。
如果你想要制作一個從這些數據中學習的模型,以便能夠識别未見過的手寫數字,你可以借鑒人類大腦學習的方式。
我們的大腦由很多細胞組成,這些細胞叫做神經元。神經元有一些像天線一樣的部分叫做樹突,它們用來接收來自其他神經元的信号。神經元的主體會決定是否要把這些信号傳遞給下一個神經元。如果決定傳遞,神經元會通過一根叫做軸突的長線把信号發送出去,直到信号到達另一個叫做突觸的地方。在突觸處,信号會被傳遞給下一個神經元。這就是我們的大腦如何處理和傳遞信息的基本方式。
當我們學習時,大腦中神經元之間的連接發生變化,它們變得更強,形成新的連接,神經元變得更高效。
人工神經網絡試圖模拟這個過程,它們由人工神經元組成,即簡單的函數,接收來自其他神經元的值,并将它們組合成一個傳遞給其他神經元的信号。
具體的情況下,上圖是一個28x28像素的圖片,每個像素值的範圍是0到1,黑色像素是0,白色像素是1,這些像素構成了輸入層。
現在我們想知道圖片顯示的是哪個數字,因為有10個可能的數字,所以我們對每個輸入的圖像産生10個預測,所以這裡可以添加10個神經元并稱之為輸出層,
每個輸入神經元(一個像素點)将連接到每個輸出神經元(0-9的10個數字),我們用所謂的權重連接它們,每個權重僅僅是一個數字,一開始這個數字可以随機選擇。
在這個例子中,有784個輸入神經元(對應于28x28像素的圖片),每個輸入神經元都連接到10個輸出神經元(對應于10個可能的數字)。所以總共會有784個像素點乘以10個數字,也就是7840個連接。每個連接都有一個權重,這些權重會在訓練過程中進行調整,以便網絡能夠正确地識别輸入圖片中的數字。
每個輸出神經元将取輸入值,将每個值乘以相應的權重并将它們求和以得到一個新值,
在這個例子中,我們期望的是,代表數字5的那個神經元給出一個很高的數值(權重),而其他代表其他數字的神經元給出的數值都比較低。這樣,網絡就能正确地識别出輸入圖片是數字5。
如果輸入數字0,再一次,隻有代表0的輸出神經元應該亮起(獲得很高的數值),這可能是我們能構建的最簡單的神經網絡。
但我們的任務是教會這個人工神經網絡識别這些數字,這意味着我們必須以某種方式改變權重,讓模型做出更好的預測,這是通過向網絡展示一系列的樣本圖片(比如手寫數字的圖片),然後觀察網絡的預測結果是否準确來完成的。如果網絡的預測結果不準确,就需要調整權重。
為了知道如何調整權重,我們使用了一個叫做“損失函數(Loss )”的工具,它可以幫助我們衡量網絡的預測結果和實際結果之間的差異。我們的目标是讓這個損失盡可能小,這意味着我們的預測越準确。
事實上,如果你可視化每個神經元的權重,随着模型學習,我們可以看到,盡管它們一開始看起來是随機的。但随着模型的學習和訓練,這些權重會逐漸調整,開始形成一些特定的模式。這些模式讓模型能夠識别不同數字的特征,從而區分它們。最初,模型可能隻能學習簡單的線性關系,這意味着它能區分一些非常基本的數字特征。
為了讓模型能夠學習更複雜的關系,我們可以在輸入層和輸出層之間添加更多的層,這些額外的層被稱為隐藏層。
添加更多的隐藏層可以使神經網絡變得“更深”,這就是“深度學習”的概念。隐藏層中的神經元和輸出層中的神經元工作方式相似,但每個神經元還有一個激活函數( ),這個函數可以是非線性的,使得模型能夠學習更複雜的關系,從而提高識别數字的準确性。
回到簡單的二維函數示例,激活函數将使我們能夠彎曲直線,以便我們可以更準确地模拟數據。
有許多激活函數,但其中最簡單的一個叫做ReLu,它把負數變成0,正數保持不變。
當我們給神經網絡添加更多的神經元或者層數時,它的能力會增加,也就是說它能學習到更複雜的東西。但是,有一個問題,如果我們讓網絡變得太大,它可能就會變得太“聰明”了,以至于它不僅學會了我們想讓它學的東西,還記住了所有的訓練數據。這種情況叫做過拟合,就像是模型變得太專注于訓練數據,以至于在面對新的、沒見過的數據時就表現不好了。另一方面,如果模型太簡單,它可能就學不到足夠的東西,這種情況叫做欠拟合。所以,神經網絡的主要目标就是找到一個平衡點,構建一個既不太複雜也不太簡單,能夠從數據中學習規律的模型。
有話要說...