강의영상

- (1/2) 기말고사 안내 + 알렉스넷

- (2/2) 로지스틱 회귀분석

Logistic regression

import torch 
import matplotlib.pyplot as plt

Example

- 현실에서 이런 경우가 많음

  • $x$가 커질수록 (혹은 작아질수록) 성공확률이 증가함.

- 이러한 모형은 아래와 같이 설계할 수 있음 <--- 외우세요!!!

  • $y_i \sim Ber(\pi_i),\quad $ where $\pi_i = \frac{\exp(w_0+w_1x_i)}{1+\exp(w_0+w_1x_i)}$

  • $\hat{y}_i= \frac{\exp(\hat{w}_0+\hat{w}_1x_i)}{1+\exp(\hat{w}_0+\hat{w}_1x_i)}=\frac{1}{1+\exp(-\hat{w}_0-\hat{w}_1x_i)}$

  • $loss= - \sum_{i=1}^{n} \big(y_i\log(\hat{y}_i)+(1-y_i)\log(1-\hat{y}_i)\big)$ <--- 외우세요!!

- 예제시작

X=torch.linspace(-1,1,2000).reshape(2000,1)
w0= - 1 
w1= 5 
u = w0+X*w1 
v = torch.exp(u)/(1+torch.exp(u)) # v=πi
y = torch.bernoulli(v) 
plt.scatter(X,y,alpha=0.05)
plt.plot(X,v,'--r')
[<matplotlib.lines.Line2D at 0x7f74306145b0>]

- 다이어그램으로 표현하면

import graphviz
def gv(s): return graphviz.Source('digraph G{ rankdir="LR"' + s + '; }')

gv('''
subgraph cluster_1{
    style=filled;
    color=lightgrey;
    "X" 
    label = "Layer 0"
}
subgraph cluster_2{
    style=filled;
    color=lightgrey;
    "X" -> "X@W"[label="@W"]
    "X@W" -> "Sigmoid(X@W)=yhat"[label="Sigmoid"]
    label = "Layer 1"
}
''')
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> G cluster_1 Layer 0 cluster_2 Layer 1 X X X@W X@W X->X@W @W Sigmoid(X@W)=yhat Sigmoid(X@W)=yhat X@W->Sigmoid(X@W)=yhat Sigmoid

gv('''
subgraph cluster_1{
    style=filled;
    color=lightgrey;
    X
    label = "Layer 0"
}
subgraph cluster_2{
    style=filled;
    color=lightgrey;
    X -> "node1=yhat"
    label = "Layer 1: Sigmoid"
}
''')
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> G cluster_1 Layer 0 cluster_2 Layer 1: Sigmoid X X node1=yhat node1=yhat X->node1=yhat

- 아키텍처, 손실함수, 옵티마이저

torch.manual_seed(43052) 
l1=torch.nn.Linear(in_features=1,out_features=1,bias=True) 
a1=torch.nn.Sigmoid() 
net=torch.nn.Sequential(l1,a1) 
#loss = torch.mean((y-yhat)**2) <--- 이러면 안됩니다!!!
optimizer=torch.optim.SGD(net.parameters(),lr=0.05) 
plt.scatter(X,y,alpha=0.01) 
plt.plot(X,net(X).data,'--') 
plt.plot(X,v,'--r')
[<matplotlib.lines.Line2D at 0x7f743046b5e0>]

- step1~4

for epoc in range(10000): 
    ## 1 
    yhat=net(X) 
    ## 2 
    loss=-torch.mean(y*torch.log(yhat) + (1-y)*torch.log(1-yhat)) 
    ## 3 
    loss.backward() 
    ## 4 
    optimizer.step() 
    net.zero_grad() 
list(net.parameters())
[Parameter containing:
 tensor([[4.7395]], requires_grad=True),
 Parameter containing:
 tensor([-0.8655], requires_grad=True)]
plt.scatter(X,y,alpha=0.01) 
plt.plot(X,net(X).data,'--') 
plt.plot(X,v,'--r')
[<matplotlib.lines.Line2D at 0x7f74284afb50>]

숙제

loss를 mse로 바꿔서 돌려볼것

torch.manual_seed(43052) 
l1=torch.nn.Linear(in_features=1,out_features=1,bias=True) 
a1=torch.nn.Sigmoid() 
net=torch.nn.Sequential(l1,a1) 
#loss = torch.mean((y-yhat)**2) <--- 이러면 안됩니다!!!
optimizer=torch.optim.SGD(net.parameters(),lr=0.05) 
for epoc in range(10000): 
    ## 1 
    yhat=net(X) 
    ## 2 
#####    loss=-torch.mean(y*torch.log(yhat) + (1-y)*torch.log(1-yhat)) <-- 여기만수정해서!!
    ## 3 
    loss.backward() 
    ## 4 
    optimizer.step() 
    net.zero_grad() 
list(net.parameters())
plt.scatter(X,y,alpha=0.01) 
plt.plot(X,net(X).data,'--') 
plt.plot(X,v,'--r')