神經網絡的線性單元不能擬合指數表達

'''
目前神經網絡一直都是採用relu(非線性單元)作爲激活函數,目的是產生類似異或表達,比如線性函數的可加性就被很好的破壞掉了
f(ax+by)=af(x)+bf(y) 在加入relu之後不成立了。

但是對於e^x 這種軌跡,relu還能有很好的擬合能力嗎?我們做個實驗看看吧。
'''
import torch
from torch import nn
import torch.optim as optimizer
import numpy as np

data_x = [1.1, 1, 4, 6, 8, 10, 11, 12, 13, 14, 15]
data_y = [np.e ** x for x in data_x]

x = torch.tensor(data_x).reshape(-1, 1).float()
y = torch.tensor(data_y).unsqueeze(1).float()


class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        self.layer1 = nn.Sequential(nn.Linear(1, 16), nn.ReLU())
        self.layer2 = nn.Sequential(nn.Linear(16, 1))
    def forward(self, x):
        x = self.layer1(x)
        x = self.layer2(x)
        x = torch.tensor(np.e) ** x  #可以註釋掉看一看
        return x

learning_rate = 1e-3
model = Net()
criterion = nn.MSELoss()
optimizer = optimizer.Adam(model.parameters(), lr=learning_rate)
for epoch in range(1000):
    out = model(x)
    optimizer.zero_grad()
    loss = criterion(out, y)
    loss.backward()
    optimizer.step()
    print(loss.data)

out = model(x)
print(data_y)
print(out)
'''
如果大家把在網絡裏前向傳播的np.e部分註釋掉會發現收斂的很慢很慢,因爲relu只能擬合直線,要用直線去擬合一個指數表達是非常困難的
當我們在前向傳播里加入了指數表達會發現收斂的非常快,數據相對更準確一點,但是缺點很明顯容易過擬合。
在構建神經網絡的時候對數據的分析要比悶着頭嘗試網絡效果要好。
'''
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章