рдкрд┐рдЫрд▓рд╛ рднрд╛рдЧ (рд▓реАрдирд┐рдпрд░ рд░рд┐рдЧреНрд░реЗрд╢рди, рдЧреНрд░реЗрдбрд┐рдПрдВрдЯ
рдбрд┐рд╕реЗрдВрдЯ рдФрд░ рдпрд╣ рд╕рдм рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ) рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ -
habr.com/en/post/471458рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рдореИрдВ рд╡рд░реНрдЧреАрдХрд░рдг рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдкрд╣рд▓реЗ рджрд┐рдЦрд╛рдКрдВрдЧрд╛, рдЬреИрд╕рд╛ рдХрд┐ рд╡реЗ рдХрд╣рддреЗ рд╣реИрдВ, "рдкреЗрди", рдмрд┐рдирд╛ рдерд░реНрдб рдкрд╛рд░реНрдЯреА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рд▓рд┐рдП SGD, рд▓реЙрдЧрд▓реЙрд╕ рдФрд░ рдЧреНрд░реЗрдбрд┐рдПрдВрдЯреНрд╕ рдХреА рдЧрдгрдирд╛, рдФрд░ рдлрд┐рд░ PyTorch рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ред
рдЙрджреНрджреЗрд╢реНрдп: рдкреАрд▓рд╛рдкрди рдФрд░ рд╕рдорд░реВрдкрддрд╛ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рд╡рд╛рд▓реА рджреЛ рд╕реНрдкрд╖реНрдЯ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░реЗрдВ рдХрд┐ рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд┐рд╕ рд╢реНрд░реЗрдгреА (рд╕реЗрдм рдпрд╛ рдирд╛рд╢рдкрд╛рддреА) рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИ (рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╡рд░реНрдЧреАрдХреГрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореЙрдбрд▓ рд╕рд┐рдЦрд╛рдПрдВ)ред
рдЖрд░рдВрдн рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдорд╛рд░реЗ рдбреЗрдЯрд╛рд╕реЗрдЯ рдЕрдкрд▓реЛрдб рдХрд░реЗрдВ:
import pandas as pd data = pd.read_csv("https://raw.githubusercontent.com/DLSchool/dlschool_old/master/materials/homeworks/hw04/data/apples_pears.csv") data.head(10)

рдЖрдЬреНрдЮрд╛ рджреЗрдирд╛: X1 - рдкреАрд▓рд╛рдкрди, x2 - рд╕рдорд░реВрдкрддрд╛, y = рддрд╛рд░
рд╣рдо рдлрд╝рдВрдХреНрд╢рди y = w1 * X1 + w2 * x2 + w0 рдмрдирд╛рддреЗ рд╣реИрдВ
(w0 рдХреЛ рдкреВрд░реНрд╡рд╛рдЧреНрд░рд╣ рдорд╛рдирд╛ рдЬрд╛рдПрдЧрд╛ (рд╕рдВрд▓рдЧреНрдиред - рдкреВрд░реНрд╡рд╛рдЧреНрд░рд╣))
рдЕрдм рд╣рдорд╛рд░рд╛ рдХрд╛рдо рд╡рдЬрд╝рди w1, w2 рдФрд░ w0 рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдХрдо рд╣реЛ рдЧрдпрд╛ рд╣реИ, рдЬреЛ рдХрд┐ X1 рдФрд░ x2 рдкрд░ y рдХреА рдирд┐рд░реНрднрд░рддрд╛ рдХрд╛ рд╕рдмрд╕реЗ рд╕рдЯреАрдХ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИред
рд╣рдо рд▓рдШреБрдЧрдгрдХ рд╣рд╛рдирд┐ рд╕рдорд╛рд░реЛрд╣ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ:

рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдмрд╛рдпрд╛рдВ рдкреИрд░рд╛рдореАрдЯрд░ рд╡рд░реНрддрдорд╛рди рднрд╛рд░ w1, w2, w0 рдХреЗ рд╕рд╛рде рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА рд╣реИ
рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рд╕рд╣реА рдкреИрд░рд╛рдореАрдЯрд░ рд╕рд╣реА рдорд╛рди рд╣реИ (рд╡рд░реНрдЧ 0 рдпрд╛ 1 рд╣реИ)
╧Г (x) x рдХрд╛ рд╕рд┐рдЧреНрдореЙрдЗрдб
рдПрдХреНрдЯрд┐рд╡реЗрд╢рди рдлрдВрдХреНрд╢рди рд╣реИ
log (x) - x рдХрд╛ рдкреНрд░рд╛рдХреГрддрд┐рдХ рд▓рдШреБрдЧрдгрдХ
рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдиреБрдХрд╕рд╛рди рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдореВрд▓реНрдп рдЬрд┐рддрдирд╛ рдЫреЛрдЯрд╛ рд╣реЛрддрд╛ рд╣реИ, рдЙрддрдирд╛ рд╣реА рдмреЗрд╣рддрд░ рд╣реИ рдХрд┐ рд╣рдордиреЗ рд╡рдЬрди 1, рдбрдмреНрд▓реНрдпреВ 2, рдбрдмреНрд▓реНрдпреВ 0 рдХреЛ рдЪреБрдирд╛ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП,
рд╕реНрдЯреЛрдЪреИрд╕реНрдЯрд┐рдХ рдЧреНрд░реЗрдбрд┐рдПрдВрдЯ рд╡рдВрд╢ рдЪреБрдиреЗрдВ ред
рдореИрдВ рдзреНрдпрд╛рди рджреЗрддрд╛ рд╣реВрдВ рдХрд┐ LogLoss рдХреЗ рд▓рд┐рдП рд╕реВрддреНрд░ рдЗрд╕ рддрдереНрдп рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдП рдПрдХ рдЕрд▓рдЧ рд░реВрдк рд▓реЗрдЧрд╛ рдХрд┐ рд╣рдо рдПрдХ рддрддреНрд╡ рдХрд╛ рдЪрдпрди рдХрд░рддреЗ рд╣реИрдВ, рди рдХрд┐ рдПрдХ рдкреВрд░реЗ рдЪрдпрди (рдпрд╛ рдПрдХ рд╕рдмрдорд┐рд╢рди, рдЬреИрд╕рд╛ рдХрд┐ рдорд┐рдиреА-рдмреИрдЪ рдврд╛рд▓ рдореВрд▓ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ):
рд╕рдорд╛рдзрд╛рди рдкреНрд░рдЧрддрд┐:рдкреНрд░рд╛рд░рдВрднрд┐рдХ рднрд╛рд░ w1, w2, w0 рдХреЛ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдорд╛рди рджрд┐рдП рдЧрдП рд╣реИрдВ
рд╣рдо рдЕрдкрдиреЗ рдбреЗрдЯрд╛рд╕реЗрдЯ рдХреЗ рдХреБрдЫ i-th рдСрдмреНрдЬреЗрдХреНрдЯ рд▓реЗрддреЗ рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╛рджреГрдЪреНрдЫрд┐рдХ), рдЗрд╕рдХреЗ рд▓рд┐рдП LogLoss рдХреА рдЧрдгрдирд╛ рдХрд░реЗрдВ (рд╣рдорд╛рд░реЗ w1, w2 рдФрд░ w0 рдХреЗ рд╕рд╛рде, рдЬрд┐рд╕реЗ рд╣рдордиреЗ рд╢реБрд░реВ рдореЗрдВ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдорд╛рди рд╕реМрдВрдкрд╛ рд╣реИ), рдлрд┐рд░ рд╣рдо рдкреНрд░рддреНрдпреЗрдХ рд╡рдЬрди 1, w2 рдФрд░ w0 рдХреЗ рд▓рд┐рдП рдЖрдВрд╢рд┐рдХ рдбреЗрд░рд┐рд╡реЗрдЯрд┐рд╡ рдХреА рдЧрдгрдирд╛ рдХрд░рддреЗ рд╣реИрдВред рдлрд┐рд░ рдкреНрд░рддреНрдпреЗрдХ рднрд╛рд░ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВред
рдереЛрдбрд╝реА рддреИрдпрд╛рд░реА: import pandas as pd import numpy as np X = data.iloc[:,:2].values
рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди: import random np.random.seed(62) w1 = np.random.randn(1) w2 = np.random.randn(1) w0 = np.random.randn(1) print(w1, w2, w0)
[0.49671415] [-0.1382643] [0.64768854]
[0.87991625] [-1.14098372] [0.22355905]
* _рдЧреНрд░реЗрдб рдЗрд╕реА рд╡рдЬрди рдХрд╛ рд╡реНрдпреБрддреНрдкрдиреНрди рд╣реИред рдореИрдВ рд╕рд╛рдорд╛рдиреНрдп рд╕реВрддреНрд░ рд▓рд┐рдЦреВрдВрдЧрд╛:

рдореБрдХреНрдд рд╢рдмреНрдж w0 рдХреЗ рд▓рд┐рдП - рдХрд╛рд░рдХ x рдХреЛ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдПрдХ рдХреЗ рдмрд░рд╛рдмрд░ рд▓рд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ)ред
рд╡реНрдпреБрддреНрдкрдиреНрди рдХреЗ рдЕрдВрддрд┐рдо рд╕реВрддреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рд╣рдо рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╣рдореЗрдВ рдиреБрдХрд╕рд╛рди рдлрд╝рдВрдХреНрд╢рди рдХреА рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ (рд╣рдореЗрдВ рдХреЗрд╡рд▓ рдЖрдВрд╢рд┐рдХ рдбреЗрд░рд┐рд╡реЗрдЯрд┐рд╡ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ)ред
рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рд╕реЗ рд╣рдорд╛рд░реЗ рдСрдмреНрдЬреЗрдХреНрдЯ рд╕реЗрдЯ рдХрд┐рдП рдЧрдП рдХрд┐рддрдиреЗ рдСрдмреНрдЬреЗрдХреНрдЯ рд╕рд╣реА рдЙрддреНрддрд░ рджреЗрддреЗ рд╣реИрдВ, рдФрд░ рдХрд┐рддрдиреЗ - рдЧрд▓рдд рд╣реИрдВред
i = 0 correct = 0 incorrect = 0 for item in y: if(np.around(x1[i] * w1 + x2[i] * w2 + w0) == item): correct += 1 else: incorrect += 1 i = i + 1 print(correct, incorrect)
925 75
np.реЗрд╢рди (x) - x рдХреЗ рдорд╛рди рдХреЛ рдЧреЛрд▓ рдХрд░рддрд╛ рд╣реИред рд╣рдорд╛рд░реЗ рд▓рд┐рдП: рдпрджрд┐ x> 0.5 рд╣реИ, рддреЛ рдорд╛рди 1 рд╣реИред рдпрджрд┐ x then 0.5 рд╣реИ, рддреЛ рдорд╛рди 0 рд╣реИред
рдФрд░ рд╡рд╕реНрддреБ рдХреА рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ 5 рд╣реЛрдиреЗ рдкрд░ рд╣рдо рдХреНрдпрд╛ рдХрд░реЗрдВрдЧреЗ? 10? 100? рдФрд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЙрдЪрд┐рдд рдорд╛рддреНрд░рд╛ рдореЗрдВ рд╡рдЬрди (рдкреВрд░реНрд╡рд╛рдЧреНрд░рд╣ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд▓рд╕) рд╣реЛрдЧрд╛ред рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рд╡рдЬрди рдХреЗ рд╕рд╛рде рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдХрд╛рдо рдХрд░рдирд╛, рдЗрд╕рдХреЗ рд▓рд┐рдП рдЧреНрд░реЗрдбрд┐рдПрдВрдЯреНрд╕ рдХреА рдЧрдгрдирд╛ рдХрд░рдирд╛ рдЕрд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИред
рд╣рдо рд▓реЛрдХрдкреНрд░рд┐рдп PyTorch рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред
PyTorch = NumPy +
CUDA + рдСрдЯреЛрдЧреНрд░рд╛рдж (рдЧреНрд░реЗрдбрд┐рдПрдВрдЯреНрд╕ рдХреА рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдЧрдгрдирд╛)
PyTorch рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди:
import torch import numpy as np from torch.nn import Linear, Sigmoid def make_train_step(model, loss_fn, optimizer): def train_step(x, y): model.train() yhat = model(x) loss = loss_fn(yhat, y) loss.backward() optimizer.step() optimizer.zero_grad() return loss.item() return train_step X = torch.FloatTensor(data.iloc[:,:2].values) y = torch.FloatTensor(data['target'].values.reshape((-1, 1))) from torch import optim, nn neuron = torch.nn.Sequential( Linear(2, out_features=1), Sigmoid() ) print(neuron.state_dict()) lr = 0.1 n_epochs = 10000 loss_fn = nn.MSELoss(reduction="mean") optimizer = optim.SGD(neuron.parameters(), lr=lr) train_step = make_train_step(neuron, loss_fn, optimizer) for epoch in range(n_epochs): loss = train_step(X, y) print(neuron.state_dict()) print(loss)
рдСрд░реНрдбрд░рдбреАрдбрд┐рдХреНрдЯ ([(weight реж.рд╡реЗрдЯ тАЩ, рдЯреЗрдВрд╕рд░ ([- реж.рекрезрек -0, реж.режрел38рей]]])), (), 0.biasтАЩ, рдЯреЗрдВрд╕рд░ ([реж.релрекрек]])]]]
рдСрд░реНрдбрд░рдбреАрдбрд┐рдХреНрдЯ ([(weight реж.рд╡реЗрдЯ тАЩ, рдЯреЗрдВрд╕рд░ ([[рел.рек реп резрел, -рез.реирезрелрем]])), () ias 0.biasтАЩ, рдЯреЗрдиреЙрд░ ([- рез.резрезрейреж])]]]
.03930133953690529
рдкрд░реАрдХреНрд╖рдг рдирдореВрдиреЗ рдкрд░ рдХрд╛рдлреА рдЕрдЪреНрдЫрд╛ рдиреБрдХрд╕рд╛рдиред
рдпрд╣рд╛рдВ,
MSELoss рдХреЛ рдПрдХ рд╣рд╛рдирд┐ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд░реВрдк
рдореЗрдВ рдЪреБрдирд╛ рдЧрдпрд╛ рд╣реИред
рд░реИрдЦрд┐рдХ рдкрд░ рдЕрдзрд┐рдХрд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ: рд╣рдо рдЗрдирдкреБрдЯ рдХреЛ 2 рдкреИрд░рд╛рдореАрдЯрд░ рджреЗрддреЗ рд╣реИрдВ (рд╣рдорд╛рд░реЗ рдПрдХреНрд╕ 1 рдФрд░ рдПрдХреНрд╕ 2 рдкрд┐рдЫрд▓реЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рдЕрдиреБрд╕рд╛рд░) рдФрд░ рд╣рдореЗрдВ рдЖрдЙрдЯрдкреБрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ (рд╡рд╛рдИ) рдорд┐рд▓рддрд╛ рд╣реИ, рдЬреЛ рдмрджрд▓реЗ рдореЗрдВ, рд╕рдХреНрд░рд┐рдпрдг рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЗрдирдкреБрдЯ рдХреЛ рдЦрд┐рд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдФрд░ рдлрд┐рд░ рдЙрдиреНрд╣реЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЧрдгрдирд╛ рдХреА рдЬрд╛рддреА рд╣реИ: рддреНрд░реБрдЯрд┐ рдлрд╝рдВрдХреНрд╢рди, рдЧреНрд░реЗрдбрд┐рдПрдВрдЯреНрд╕ рдХрд╛ рдореВрд▓реНрдпред рдЕрдВрдд рдореЗрдВ - рд╡рдЬрди рдЕрдкрдбреЗрдЯ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред
рд▓реЗрдЦ рдореЗрдВ рдкреНрд░рдпреБрдХреНрдд рд╕рд╛рдордЧреНрд░реА