рдмрд╛рдЗрдирд░реА рд╡рд░реНрдЧреАрдХрд░рдг рд╕рдорд╕реНрдпрд╛ рдореЗрдВ рд▓реЙрдЧрд░рд┐рджрдорд┐рдХ рд▓реЙрд╕ рдлрдВрдХреНрд╢рди (рд▓реЙрдЧрд▓реЙрд╕) рдХреЗ рд▓рд┐рдП рд╕реНрдЯреЛрдЪреИрд╕реНрдЯрд┐рдХ рдЧреНрд░реЗрдбрд┐рдПрдВрдЯ рдбрд┐рд╕реЗрдВрдЯ (SGD)

рдкрд┐рдЫрд▓рд╛ рднрд╛рдЧ (рд▓реАрдирд┐рдпрд░ рд░рд┐рдЧреНрд░реЗрд╢рди, рдЧреНрд░реЗрдбрд┐рдПрдВрдЯ рдбрд┐рд╕реЗрдВрдЯ рдФрд░ рдпрд╣ рд╕рдм рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ) рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ - 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 #  - y = data['target'].values.reshape((-1, 1)) #  (    ) x1 = X[:, 0] x2 = X[:, 1] def sigmoid(x): return 1 / (1 + np.exp(-x)) 


рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди:

 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) # form range 0..999 idx = np.arange(1000) # random shuffling np.random.shuffle(idx) x1, x2, y = x1[idx], x2[idx], y[idx] # learning rate lr = 0.001 # number of epochs n_epochs = 10000 for epoch in range(n_epochs): i = random.randint(0, 999) yhat = w1 * x1[i] + w2 * x2[i] + w0 w1_grad = -((y[i] - sigmoid(yhat)) * x1[i]) w2_grad = -((y[i] - sigmoid(yhat)) * x2[i]) w0_grad = -(y[i] - sigmoid(yhat)) w1 -= lr * w1_grad w2 -= lr * w2_grad w0 -= lr * w0_grad 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 рдкрд┐рдЫрд▓реЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рдЕрдиреБрд╕рд╛рд░) рдФрд░ рд╣рдореЗрдВ рдЖрдЙрдЯрдкреБрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ (рд╡рд╛рдИ) рдорд┐рд▓рддрд╛ рд╣реИ, рдЬреЛ рдмрджрд▓реЗ рдореЗрдВ, рд╕рдХреНрд░рд┐рдпрдг рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЗрдирдкреБрдЯ рдХреЛ рдЦрд┐рд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдФрд░ рдлрд┐рд░ рдЙрдиреНрд╣реЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЧрдгрдирд╛ рдХреА рдЬрд╛рддреА рд╣реИ: рддреНрд░реБрдЯрд┐ рдлрд╝рдВрдХреНрд╢рди, рдЧреНрд░реЗрдбрд┐рдПрдВрдЯреНрд╕ рдХрд╛ рдореВрд▓реНрдпред рдЕрдВрдд рдореЗрдВ - рд╡рдЬрди рдЕрдкрдбреЗрдЯ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред

рд▓реЗрдЦ рдореЗрдВ рдкреНрд░рдпреБрдХреНрдд рд╕рд╛рдордЧреНрд░реА

Source: https://habr.com/ru/post/hi472300/


All Articles