最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

4.1 淺層神經(jīng)網(wǎng)絡(luò)——從線性模型講起

2023-02-01 13:11 作者:梗直哥丶  | 我要投稿

萬事都有個起源。就像我們小時候?qū)懽郑际菑囊粰M一豎、一撇一捺開始學起一樣。別嫌棄它的簡單,其中卻蘊含了深刻的哲學思想。道家不是說“一生二,二生三,三生萬物”嗎?機器學習其實也是一樣,它很多的思想都是在模擬人的智慧,因此也是從最簡單的開始。這就是傳說中的線性模型了。我們在《機器學習必修課》中對線性模型用了專門一章進行了特別深入詳細的介紹,讓你從根上深刻理解這種思想的基本原理和精妙之處。這個思想學好了,一通百通,很多機器學習算法,比如決策樹、隨機森林、SVM、神經(jīng)網(wǎng)絡(luò)都能理解的更加到位。本章側(cè)重深度學習,因此僅簡單回顧線性回歸問題的主要思想,然后快速進入到神經(jīng)網(wǎng)絡(luò)的學習中,你只要能弄明白神經(jīng)網(wǎng)絡(luò)其實就是很多個線性模型的組合就行了。

?

4.1.1?什么是回歸問題

回歸,英文是regression,可以認為是機器學習中最簡單最基本的任務(wù)。直觀理解就是根據(jù)過去的一堆數(shù)據(jù)進行預測。人類最本源的智能抽象出來,其中一種就可以叫做回歸,也就是根據(jù)過去的經(jīng)驗數(shù)據(jù)預測下一步發(fā)生的事情?;貧w問題可以幫助我們對未來的趨勢或變化做出預測,例如,預測房價趨勢、預測股票價格波動等。

統(tǒng)計學把這個過程用嚴謹?shù)臄?shù)學模型表示了出來。訓練數(shù)據(jù)通常包含一組輸入特征和一個連續(xù)的輸出值,目標是建立一個模型,通過學習這些訓練數(shù)據(jù)來預測新的輸入數(shù)據(jù)的輸出值?;貧w模型中最簡單的就是我們初中學過的直線方程,也就是傳說中的線性回歸。

為了評估回歸模型的精度,我們通常使用均方誤差(Mean Squared Error, MSE)或平均絕對誤差(Mean Absolute Error, MAE)作為度量標準,這就是所謂的目標函數(shù),有時也叫損失函數(shù)。均方誤差是指預測值與真實值之差的平方和的平均數(shù),而平均絕對誤差則是指預測值與真實值之差的絕對值的平均數(shù)。較低的均方誤差或平均絕對誤差表明模型的預測精度較高。

回歸問題在許多領(lǐng)域都有廣泛應(yīng)用,例如金融、房地產(chǎn)、市場預測、天氣預報、醫(yī)學診斷等。模型的精度對于決策的正確性和風險的評估都非常重要。回歸問題有許多不同的模型算法可供選擇,這些算法的選擇取決于數(shù)據(jù)的特征、輸出的類型和問題的復雜程度。例如,線性回歸是一種簡單的回歸模型,其假設(shè)輸入與輸出之間存在一個線性關(guān)系,而決策樹回歸則可以處理更復雜的非線性關(guān)系。除了基本的回歸算法之外,還有許多其他的回歸技術(shù),例如嶺回歸、貝葉斯回歸、彈性網(wǎng)絡(luò)回歸等,可以用于解決更復雜的回歸問題?;貧w問題也可以與其他機器學習技術(shù)結(jié)合使用,例如模型集成方法,可以通過將多個回歸模型結(jié)合起來,來提高預測精度。這些都是機器學習課程的內(nèi)容,如果你不熟悉或者感興趣,歡迎訪問我們的課程學習。

4.1.2?線性回歸的基本思想

線性回歸是一種廣泛使用的統(tǒng)計學方法,用于研究兩個變量之間的關(guān)系。假設(shè)有一個輸入變量?x 和一個輸出變量 y,這兩個變量之間存在一個線性關(guān)系,即 y=wx+b。其中,w 和 b 是線性回歸模型的參數(shù),x 是輸入變量,y 是輸出變量。

線性回歸的目標是找到一組最優(yōu)的?w 和 b,使得模型能夠盡可能準確地預測 y。為了實現(xiàn)這一目標,我們需要一組訓練數(shù)據(jù),包括輸入變量和輸出變量的值。我們可以使用這些數(shù)據(jù)來計算 w 和 b 的最優(yōu)值。

線性回歸的優(yōu)點在于簡單易行,容易理解和實現(xiàn)。它可以適用于許多不同的應(yīng)用場景,并且在很多情況下都能取得較好的預測效果。當然,線性回歸也有一些局限性。它假設(shè)輸入變量和輸出變量之間存在線性關(guān)系,如果數(shù)據(jù)的真實關(guān)系不是線性的,那么線性回歸的預測效果就會變差。另外,線性回歸只能處理一個輸入變量的情況,如果輸入變量有多個,就需要使用其他方法,比如多元線性回歸或者其他模型。

說一千道一萬,不如來個實際的例子演示一遍更直接。下面咱們就用一個簡單的實例,帶你理解一下線性回歸模型的訓練流程。一邊講思路,一邊看公式,一邊用python代碼編程實現(xiàn)。

4.1.3?線性模型的例子

假設(shè)我們希望通過研究學生的學習時間和考試成績之間的關(guān)系,來預測學生的考試成績。
我們收集了?10 名學生的學習時間 x 和考試成績 y 的數(shù)據(jù),如下表所示:

我們希望通過線性回歸的方法來建立一個模型,預測學生的考試成績。具體怎么辦呢?首先,我們假設(shè)模型的形式為?y=w*x+b。沒錯就這么簡單,這就是傳說中的機器學習模型了!現(xiàn)在的目的是要求解?w 和 b 的最優(yōu)值。為此先要確定一個目標函數(shù)。這是個什么鬼呢?

4.1.4?損失函數(shù)

在機器學習中,目標函數(shù)是用于衡量預測模型的性能的函數(shù)。它可以幫助我們評估模型的準確度,并幫助我們決定是否需要對模型進行調(diào)整。

目標函數(shù)通常是建立在訓練數(shù)據(jù)集上的,并且在訓練過程中不斷優(yōu)化。通常,我們會使用梯度下降算法來不斷調(diào)整模型的參數(shù),使得目標函數(shù)的值越來越小。

常見的目標函數(shù)包括均方誤差?(mean squared error, MSE) 和交叉熵 (cross-entropy)。均方誤差是常用于回歸問題的目標函數(shù),它衡量的是預測值與真實值之間的差距,很多時候又被稱為最小二乘法,其實是一回事。最小二乘就是最小平方差的意思。交叉熵則常用于分類問題,它衡量的是模型的預測概率分布與真實概率分布之間的差距。

說點人聽得懂的大白話,就是先確立一個標準。在上面的例子中,最簡單的就是預測值和真實值之間的均方誤差嘛!為啥要平方,很簡單啊,否則會出現(xiàn)正負誤差。這其實是統(tǒng)計中非常簡單和常見的一個計算標準。用公式來表示就是:


其中,x? 和 y? 分別表示 x 和 y 的平均值,i 從 1 到 n。

import?numpy?as?np
x?=?np.array([1,1.5,2,2.5,3,3.5,4,4.5,5,5.5])
y?=?np.array([22,30,25,50,45,75,70,78,83,91])

x_mean?=?np.mean(x)
y_mean?=?np.mean(y)
m?=?0
n?=?0
for?i,j?in?zip(x,y):
????m?+=?(i-x_mean)*(j-y_mean)
for?i?in?x:
????n?+=?(i-x_mean)*(i-x_mean)
w?=?m/n
b?=?y_mean?-?w*x_mean
print(w,b)

16.327272727272728 3.836363636363636

使用這些公式,可以直接計算出線性回歸模型的參數(shù)?w 和 b 的值。例如,假設(shè)我們使用上表中的數(shù)據(jù)來計算,得到的結(jié)果為 w = 16.32,b = 3.83。
這就意味著,我們得到了一個線性回歸模型:y = 16.32 * x + 3.83。使用這個模型,就可以預測學生的考試成績。例如,假設(shè)一名學生學習了 3 小時,用這個模型預測他的考試成績?yōu)?52 分。

這就是一個最簡單線性回歸的例子了。通過收集學習時間和考試成績的數(shù)據(jù),使用最小二乘法來估計線性回歸模型的參數(shù),并使用模型來預測學生的考試成績。

是不是有點不敢相信?!就這么簡單嗎?你的質(zhì)疑也有道理,如果所有的問題都是這么簡單就好了,壓根也不需要統(tǒng)計學和機器學習了。事實上,很多時候?qū)嶋H問題要遠比這個例子復雜的多。復雜在哪里呢?首先數(shù)據(jù)量要大,動不動就是百萬起,而且都是高維度的數(shù)據(jù);其次,多數(shù)情況下目標函數(shù)要遠比這個式子復雜的多,要知道線性模型,尤其是線性回歸是最最簡單的情況;第三,目標函數(shù)沒有解析解了,也就是說把數(shù)據(jù)帶進目標函數(shù)方程后求不出來了,這種情況下只能用計算機來逼近,這就是所謂的最優(yōu)化方法。咱們用pytorch看看怎么用代碼來求解上面的這個線性回歸問題。走一遍下來你就徹底明白了。

首先,我們需要準備訓練數(shù)據(jù)。在這個例子中,我們可以使用以下?Python 代碼來準備訓練數(shù)據(jù):

import?torch

#?準備訓練數(shù)據(jù)
x?=?torch.tensor([[1], [1.5], [2], [2.5], [3], [3.5], [4], [4.5], [5], [5.5]], dtype=torch.float32)
y?=?torch.tensor([[22], [30], [25], [50], [45], [75], [70], [78], [83], [91]], dtype=torch.float32)

然后,我們需要定義線性回歸模型。在?PyTorch 中,可以使用 nn.Linear 模塊來定義線性回歸模型。我們可以使用以下 Python 代碼來定義線性回歸模型:

?

import?torch.nn?as?nn

#?定義線性回歸模型
model?=?nn.Linear(1,?1)

你先別管這個Linear()函數(shù)內(nèi)部是怎么實現(xiàn)的,就當它是剛定義的直線方程好了。實際上,它就是有一個神經(jīng)元的極其簡單的神經(jīng)網(wǎng)絡(luò),我們稍后會講神經(jīng)網(wǎng)絡(luò)其實就是由很多個線性模型組成的大的結(jié)構(gòu)。所以最簡單的神經(jīng)元就是線性模型。咱們可以用這樣的代碼來模擬線性回歸。

接下來,我們需要定義損失函數(shù)和優(yōu)化器。在這個例子中,我們使用均方誤差(mean squared error,MSE)作為損失函數(shù),并使用隨機梯度下降(SGD)作為優(yōu)化器。得嘞,這個優(yōu)化器是個啥呢?

4.1.5?優(yōu)化器:隨機梯度下降法

機器學習優(yōu)化器是用于訓練機器學習模型的算法。機器學習優(yōu)化器可以分為基于梯度的優(yōu)化器和非基于梯度的優(yōu)化器。

基于梯度的優(yōu)化器是基于損失函數(shù)的梯度來更新模型參數(shù)的。常用的基于梯度的優(yōu)化器包括隨機梯度下降(SGD)、動量法(Momentum)、Adagrad、RMSProp和Adam。

非基于梯度的優(yōu)化器是基于非梯度信息來更新模型參數(shù)的。常用的非基于梯度的優(yōu)化器包括模擬退火法(Simulated Annealing)和遺傳算法(Genetic Algorithm)。

最簡單的優(yōu)化器是隨機梯度下降(SGD)。它是一種基于梯度的優(yōu)化器,在每次迭代時使用一個小的訓練樣本來計算損失函數(shù)的梯度。SGD的優(yōu)點在于它簡單易用,但是可能不夠穩(wěn)定,因為它可能會跳出最優(yōu)解。

說這么多,就是先讓你有點感性知識。一上來聽不懂沒關(guān)系,咱們先看代碼例子一下子就明白了。不過這些信息我們會反復講,你忍忍,反復聽,開始不懂,聽多了慢慢就懂了。這就像是瞎子摸象,開始只是看到一部分,慢慢拼湊出對問題的完整認知。直接上代碼!

?

#?定義損失函數(shù)和優(yōu)化器
loss_fn?=?nn.MSELoss()
optimizer?=?torch.optim.SGD(model.parameters(), lr=1e-3)

是不是不敢相信自己的眼睛!就兩行嘛!是的,就兩行。前者指定損失函數(shù),后者指定優(yōu)化器SGD。要知道現(xiàn)在的機器學習算法都封裝的很好了,洋洋灑灑說了半天,但實際上你根本不用關(guān)心其中執(zhí)行的細節(jié),一句話就能調(diào)用了。不過,要想真正理解其中的原理,還是要鉆到函數(shù)的肚子里看清楚。這部分內(nèi)容我們后續(xù)課程會再講,你也可以選修我們的前置課程《機器學習必修課》,那里會掰開了揉碎了給你拆解清楚。都是學深度學習,是有不同境界的。要求不高的,能看懂代碼會調(diào)包就行了,這叫知其然。如果你就是找個工作,混口飯吃,把自己定位為一個大廠小廠的工具人,攻城獅,程序員,這其實也就夠了。但是如果還想混的好一點,那就要知其所以然,深入了解其中的工作原理,甚至要想通想透。

繼續(xù)看代碼。然后,我們可以開始訓練模型了。我們可以使用以下?Python 代碼來訓練模型:

?

#?訓練模型
losses?=?[] ?#?用于保存每次迭代的損失
for?epoch?in?range(1000):
????#?前向傳播
????y_pred?=?model(x)
????#?計算損失
????loss?=?loss_fn(y_pred, y)
????losses.append(loss.item()) ?#?將損失保存到數(shù)組中
????#?清空梯度
????optimizer.zero_grad()
????#?反向傳播
????loss.backward()
????#?更新參數(shù)
????optimizer.step()

在訓練過程中,我們使用前向傳播來計算預測值,使用損失函數(shù)來計算損失,使用反向傳播來計算梯度,然后使用優(yōu)化器來更新模型參數(shù)。

最后,我們可以使用以下?Python 代碼來查看訓練后的模型的參數(shù):

?

#?查看訓練后的模型的參數(shù)
print(model.weight)
print(model.bias)

Parameter containing:
tensor([[16.2470]], requires_grad=True)
Parameter containing:
tensor([4.1441], requires_grad=True)

這樣,我們就使用?PyTorch 編寫了一個線性回歸的例子。我們通過收集學習時間和考試成績的數(shù)據(jù),使用最小二乘法來估計線性回歸模型的參數(shù),使用上表中的數(shù)據(jù)來計算,得到的結(jié)果為 w = 16.24,b = 4.14。

4.1.6?如何使用模型進行預測

模型訓練出來了,怎么用它來預測呢?也很簡單,代碼繼續(xù)!

為了使用訓練得到的模型預測一個學生的成績,我們需要先定義這個學生的學習時間?x。假設(shè)這個學生學習了 5 小時,我們可以使用以下 Python 代碼來定義 x_test:

x_test?=?torch.tensor([5], dtype=torch.float32)

然后,我們可以使用以下?Python 代碼來使用訓練得到的模型預測這個學生的成績 y:

y_pred?=?model(x_test)
print(y_pred)

tensor([85.3794], grad_fn=<AddBackward0>)

運行這段代碼,就可以得到這個學生的成績預測值?y_pred = 16.24* 5 + 4.14 = 85.37。

注意,這里的預測值?y_pred 是一個 PyTorch 張量,如果我們想要將其轉(zhuǎn)換為 Python 的浮點數(shù),可以使用以下代碼:

?

prediction?=?y_pred.item()
print(prediction)

85.37937927246094

運行這段代碼,就可以得到這個學生的成績預測值,這個預測值就是?Python 的浮點數(shù)。

4.1.7?可視化展示模型

為了可視化地展示上述例子中的訓練數(shù)據(jù)和訓練得到的線性模型,我們可以使用?matplotlib 庫。

import?matplotlib.pyplot?as?plt

#?可視化展示訓練數(shù)據(jù)
plt.scatter(x, y)

#?可視化展示訓練得到的線性模型
x_range?=?torch.arange(1,?6,?0.1).view(-1,?1)
y_pred?=?model(x_range)
plt.plot(x_range.numpy(), y_pred.detach().numpy())

plt.xlabel("Study Time (hours)")
plt.ylabel("Exam Score")
plt.title("Linear Regression Model")

plt.show()

在這段代碼中,我們使用?plt.scatter 函數(shù)來可視化展示訓練數(shù)據(jù),使用 plt.plot 函數(shù)來可視化展示訓練得到的線性模型。我們還可以使用 plt.xlabel、plt.ylabel 和 plt.title 函數(shù)來添加圖表的標簽和標題。最后,使用 plt.show 函數(shù)來顯示圖表。

運行這段代碼,就可以看到訓練數(shù)據(jù)和訓練得到的線性模型的可視化展示。

為了可視化的顯示訓練的過程,可以添加這樣一段代碼:

?

#?可視化展示訓練過程
plt.plot(losses)
plt.xlabel('Epoch')
plt.ylabel('Loss')
plt.title('Training Progress')
plt.show()

?


運行后就能顯示下面的圖像,從中我們可以看出整個神經(jīng)網(wǎng)絡(luò)訓練迭代了1000次,每次都把訓練樣本的數(shù)據(jù)算一遍得到一個損失,然后調(diào)整參數(shù),不斷減小訓練的損失。在60多次的時候梯度下降法就收斂的不錯了,縱軸的誤差Loss就已經(jīng)變的很小了。

梗直哥提示:通過這樣一個簡潔的小例子,相比你已經(jīng)對機器學習乃至于使用神經(jīng)網(wǎng)絡(luò)訓練的大致流程有了感性的理解和認識。從代碼量上可以說非常的簡單,真正有用的就是幾行,其他大多數(shù)是準備數(shù)據(jù)和輸出結(jié)果或者是可視化數(shù)據(jù)或結(jié)果。真正的訓練就是明確目標函數(shù),優(yōu)化器類型,然后就是一個for循環(huán)迭代,根據(jù)目標函數(shù)計算損失,然后反向傳播,更新參數(shù),齊活!基本上所有的深度學習訓練都是這樣一個套路。

4.1.8?最小化均方誤差和極大似然估計

我們經(jīng)常聽到最小化均方誤差MSE,最小二乘法LSM (Least squares method),還有極大似然估計MLE,很多同學暈頭轉(zhuǎn)向搞不清楚它們之間的關(guān)系。其實前兩者是一回事,都是后面這種情況的特例。

在線性回歸模型中,觀測值y和預測值之間的差異可以用均方誤差(MSE)來表示:

?

可以發(fā)現(xiàn),觀測值的對數(shù)似然函數(shù)與均方誤差的形式是相似的。因此,最小化均方誤差等價于最大化觀測值的對數(shù)似然函數(shù),即等價于線性模型在高斯分布下的最大似然估計。

深入思考和進階學習?:

這部分內(nèi)容涉及比較多的數(shù)學知識和機器學習的算法理解,如果你在這方面的基礎(chǔ)不是很扎實,強烈建議回過頭學好機器學習課程,否則各種概念會反復困擾你的理解,比如MLE、MAP和貝葉斯估計的區(qū)別聯(lián)系等等。歡迎選修梗直哥《機器學習必修課:十大經(jīng)典算法與python實戰(zhàn)》

同步更新

Github/公眾號搜索“梗直哥”

?


4.1 淺層神經(jīng)網(wǎng)絡(luò)——從線性模型講起的評論 (共 條)

分享到微博請遵守國家法律
焦作市| 启东市| 漯河市| 贵南县| 阿合奇县| 山西省| 三都| 阜城县| 什邡市| 太康县| 通道| 信宜市| 西乌| 大田县| 灵武市| 沾益县| 安吉县| 白河县| 建阳市| 湄潭县| 黑河市| 通江县| 霸州市| 秭归县| 青龙| 昭苏县| 郎溪县| 锦屏县| 五大连池市| 吉木乃县| 鄄城县| 开阳县| 道真| 高陵县| 卢龙县| 慈溪市| 松原市| 远安县| 宣城市| 昭苏县| 扎赉特旗|