import torch
import pandas as pd
import matplotlib.pyplot as plt
1. imports
2. Data - AbAcAd
-
데이터
= list('AbAcAd'*50)
txt 10] txt[:
['A', 'b', 'A', 'c', 'A', 'd', 'A', 'b', 'A', 'c']
= pd.DataFrame({'x':txt[:-1], 'y':txt[1:]})
df_train 5] df_train[:
x | y | |
---|---|---|
0 | A | b |
1 | b | A |
2 | A | c |
3 | c | A |
4 | A | d |
= torch.tensor(df_train.x.map({'A':0,'b':1,'c':2,'d':3}))
x = torch.tensor(df_train.y.map({'A':0,'b':1,'c':2,'d':3}))
y = torch.nn.functional.one_hot(x).float()
X = torch.nn.functional.one_hot(y).float() y
X.shape, y.shape
(torch.Size([299, 4]), torch.Size([299, 4]))
3. rNNcell
class rNNCell(torch.nn.Module):
def __init__(self):
super().__init__()
self.i2h = torch.nn.Linear(4,2)
self.h2h = torch.nn.Linear(2,2)
self.tanh = torch.nn.Tanh()
def forward(self,Xt,ht):
return self.tanh(self.i2h(Xt)+self.h2h(ht))
43052)
torch.manual_seed(= rNNCell()
rnncell = torch.nn.Linear(2,4)
cook = torch.nn.CrossEntropyLoss()
loss_fn = torch.optim.Adam(list(rnncell.parameters())+list(cook.parameters()),lr=0.1)
optimizr #---#
= len(X)
L for epoc in range(200):
#1~2
= 0
loss = torch.zeros(2) # 맹물
ht for t in range(L):
= X[t],y[t]
Xt, yt = rnncell(Xt,ht) #tanh(linr(xt)+linr(ht))
ht = cook(ht)
ot #yt_hat = soft(ot)
= loss + loss_fn(ot, yt)
loss = loss/L
loss #3
loss.backward()#4
optimizr.step() optimizr.zero_grad()
-
결과확인 및 시각화
= torch.zeros(L,2)
h = torch.zeros(2)
water 0] = rnncell(X[0],water)
h[for t in range(1,L):
= rnncell(X[t],h[t-1])
h[t] h.shape
torch.Size([299, 2])
= torch.nn.functional.softmax(cook(h),dim=1)
yhat yhat
tensor([[4.1978e-03, 9.4555e-01, 1.9557e-06, 5.0253e-02],
[9.9994e-01, 5.5569e-05, 8.4751e-10, 1.3143e-06],
[2.1349e-07, 1.1345e-06, 9.7019e-01, 2.9806e-02],
...,
[2.1339e-07, 1.1339e-06, 9.7020e-01, 2.9798e-02],
[9.9901e-01, 9.6573e-04, 6.9303e-09, 2.1945e-05],
[7.2919e-04, 2.5484e-02, 3.3011e-02, 9.4078e-01]],
grad_fn=<SoftmaxBackward0>)
= torch.concat([X,h,yhat],axis=1).data
mat 12],cmap="bwr",vmin=-1, vmax=1)
plt.matshow(mat[:
plt.colorbar()
plt.xticks(range(10),
r"$X_A$", r"$X_b$",r"$X_c$",r"$X_d$",
[r'$h_1$',r'$h_2$',
r'$\hat{y}_A$',r'$\hat{y}_b$',r'$\hat{y}_c$',r'$\hat{y}_d$']
;
)=3.5,color='lime')
plt.axvline(x=5.5,color='lime') plt.axvline(x
4. torch.nn.RNNcell
0)
torch.manual_seed(= torch.nn.RNNCell(4,2)
rnncell = torch.nn.Linear(2,4)
cook = torch.nn.CrossEntropyLoss()
loss_fn = torch.optim.Adam(list(rnncell.parameters())+list(cook.parameters()),lr=0.1) optimizr
= len(X)
L for epoc in range(200):
## 1~2
= torch.zeros(2)
ht = 0
loss for t in range(L):
= X[t], y[t]
Xt, yt = rnncell(Xt, ht)
ht = cook(ht)
ot = loss + loss_fn(ot, yt)
loss = loss/L
loss ## 3
loss.backward()## 4
optimizr.step() optimizr.zero_grad()
= torch.zeros(L,2)
h = torch.zeros(2)
water 0] = rnncell(X[0],water)
h[for t in range(1,L):
= rnncell(X[t],h[t-1])
h[t] = torch.nn.functional.softmax(cook(h),dim=1)
yhat yhat
tensor([[4.6404e-04, 8.6681e-01, 1.3271e-01, 2.1127e-05],
[9.9893e-01, 7.6733e-07, 4.0587e-04, 6.6831e-04],
[1.8856e-04, 8.8543e-05, 1.9117e-01, 8.0855e-01],
...,
[1.5757e-03, 3.7491e-02, 9.2757e-01, 3.3366e-02],
[9.9012e-01, 1.0751e-07, 5.2768e-04, 9.3539e-03],
[4.0457e-05, 5.4018e-06, 4.8826e-02, 9.5113e-01]],
grad_fn=<SoftmaxBackward0>)
= torch.concat([X,h,yhat],axis=1).data
mat 12],cmap="bwr",vmin=-1, vmax=1)
plt.matshow(mat[:
plt.colorbar()
plt.xticks(range(10),
r"$X_A$", r"$X_b$",r"$X_c$",r"$X_d$",
[r'$h_1$',r'$h_2$',
r'$\hat{y}_A$',r'$\hat{y}_b$',r'$\hat{y}_c$',r'$\hat{y}_d$']
;
)=3.5,color='lime')
plt.axvline(x=5.5,color='lime') plt.axvline(x
-
torch.nn.RNNCell
의 가중치를 이전에 직접 설계한 rNNCell
과 동일하게 설정한 후 학습
- 우리가 직접 만든 클래스
rNNCell
이 torch에서 기본 제공하는torch.nn.RNNCell
과 동일 기능을 수행한다는 것을 확인하기 위함
43052)
torch.manual_seed(= rNNCell()
_rnncell = torch.nn.Linear(2,4) cook
= torch.nn.RNNCell(4,2)
rnncell = _rnncell.i2h.weight.data
rnncell.weight_ih.data = _rnncell.h2h.weight.data
rnncell.weight_hh.data = _rnncell.i2h.bias.data
rnncell.bias_ih.data = _rnncell.h2h.bias.data rnncell.bias_hh.data
= torch.nn.CrossEntropyLoss()
loss_fn = torch.optim.Adam(list(rnncell.parameters())+list(cook.parameters()),lr=0.1) optimizr
= len(X)
L for epoc in range(200):
## 1~2
= torch.zeros(2)
ht = 0
loss for t in range(L):
= X[t], y[t]
Xt, yt = rnncell(Xt, ht)
ht = cook(ht)
ot = loss + loss_fn(ot, yt)
loss = loss/L
loss ## 3
loss.backward()## 4
optimizr.step() optimizr.zero_grad()
= torch.zeros(L,2)
h = torch.zeros(2)
water 0] = rnncell(X[0],water)
h[for t in range(1,L):
= rnncell(X[t],h[t-1])
h[t] = torch.nn.functional.softmax(cook(h),dim=1)
yhat yhat
tensor([[4.1978e-03, 9.4555e-01, 1.9557e-06, 5.0253e-02],
[9.9994e-01, 5.5569e-05, 8.4751e-10, 1.3143e-06],
[2.1349e-07, 1.1345e-06, 9.7019e-01, 2.9806e-02],
...,
[2.1339e-07, 1.1339e-06, 9.7020e-01, 2.9798e-02],
[9.9901e-01, 9.6573e-04, 6.9303e-09, 2.1945e-05],
[7.2919e-04, 2.5484e-02, 3.3011e-02, 9.4078e-01]],
grad_fn=<SoftmaxBackward0>)
= torch.concat([X,h,yhat],axis=1).data
mat 12],cmap="bwr",vmin=-1, vmax=1)
plt.matshow(mat[:
plt.colorbar()
plt.xticks(range(10),
r"$X_A$", r"$X_b$",r"$X_c$",r"$X_d$",
[r'$h_1$',r'$h_2$',
r'$\hat{y}_A$',r'$\hat{y}_b$',r'$\hat{y}_c$',r'$\hat{y}_d$']
;
)=3.5,color='lime')
plt.axvline(x=5.5,color='lime') plt.axvline(x
5. torch.nn.RNN
ref: https://docs.pytorch.org/docs/stable/generated/torch.nn.RNN.html
RNNCell , 배치사용 X |
RNNCell , 배치사용 O |
|
---|---|---|
X | \((L,H_{in})\) | \((L, N, H_{in})\) |
h | \((L,H_{out})\) | \((L, N, H_{out})\) |
y | \((L,Q)\) | \((L, N, Q)\) |
Xt | \((H_{in},)\) | \((N, H_{in})\) |
ht | \((H_{out},)\) | \((N, H_{out})\) |
yt | \((Q,)\) | \((N,Q)\) |
RNN , 배치사용 X |
RNN , 배치사용 O |
|
---|---|---|
X | \((L,H_{in})\) | \((L, N, H_{in})\) |
h | \((L,H_{out})\) | \((L, N, H_{out})\) |
y | \((L,Q)\) | \((L, N, Q)\) |
hx | \((D\times {\tt num\_layers},H_{out})\) | \((D\times {\tt num\_layers},N,H_{out})\) |
-
torch.nn.RNN
을 활용한 학습
0)
torch.manual_seed(= torch.nn.RNN(
rnn = 4, # X.shape=(299,4)
input_size= 2, # h.shape=(299,2)
hidden_size = 1, # 우리수업에서는 그냥1
num_layers = False # 우리수업에서는 항상 False
bidirectional
)= torch.nn.Linear(2,4)
cook = torch.nn.CrossEntropyLoss()
loss_fn = torch.optim.Adam(list(rnn.parameters())+list(cook.parameters()),lr=0.1) optimizr
= 1
D = 1
n_of_layers = torch.zeros(D*n_of_layers,2)
waters for epoc in range(200):
## 1
= rnn(X,waters)
h, hL = cook(h)
out ## 2
= loss_fn(out,y)
loss ## 3
loss.backward()## 4
optimizr.step() optimizr.zero_grad()
= torch.nn.functional.softmax(out,dim=1) yhat
= torch.concat([X,h,yhat],axis=1).data
mat 12],cmap="bwr",vmin=-1, vmax=1)
plt.matshow(mat[:
plt.colorbar()
plt.xticks(range(10),
r"$X_A$", r"$X_b$",r"$X_c$",r"$X_d$",
[r'$h_1$',r'$h_2$',
r'$\hat{y}_A$',r'$\hat{y}_b$',r'$\hat{y}_c$',r'$\hat{y}_d$']
;
)=3.5,color='lime')
plt.axvline(x=5.5,color='lime') plt.axvline(x
-
torch.nn.RNN
의 가중치를 이전에 직접 설계한 rNNCell
과 동일하게 설정한 이후 학습
43052)
torch.manual_seed(= rNNCell()
_rnncell = torch.nn.Linear(2,4)
cook = torch.nn.RNN(
rnn = 4, # X.shape=(299,4)
input_size= 2, # h.shape=(299,2)
hidden_size = 1, # 우리수업에서는 그냥1
num_layers = False # 우리수업에서는 항상 False
bidirectional
)= _rnncell.h2h.weight.data
rnn.weight_hh_l0.data = _rnncell.i2h.weight.data
rnn.weight_ih_l0.data = _rnncell.h2h.bias.data
rnn.bias_hh_l0.data = _rnncell.i2h.bias.data
rnn.bias_ih_l0.data = torch.nn.CrossEntropyLoss()
loss_fn = torch.optim.Adam(list(rnn.parameters())+list(cook.parameters()),lr=0.1) optimizr
= 1
D = 1
n_of_layers = torch.zeros(D*n_of_layers,2)
waters for epoc in range(200):
## 1
= rnn(X,waters)
h, hL = cook(h)
out ## 2
= loss_fn(out,y)
loss ## 3
loss.backward()## 4
optimizr.step() optimizr.zero_grad()
= torch.nn.functional.softmax(out,dim=1)
yhat yhat
tensor([[4.1735e-03, 9.4560e-01, 2.0230e-06, 5.0224e-02],
[9.9994e-01, 5.7244e-05, 8.9595e-10, 1.3591e-06],
[2.2307e-07, 1.2191e-06, 9.6979e-01, 3.0213e-02],
...,
[2.2298e-07, 1.2186e-06, 9.6979e-01, 3.0207e-02],
[9.9892e-01, 1.0570e-03, 7.6837e-09, 2.4104e-05],
[9.3831e-04, 3.6736e-02, 2.3406e-02, 9.3892e-01]],
grad_fn=<SoftmaxBackward0>)
#위의 결과는 아래와 다르지만 그냥 같다고 생각합시다.
# tensor([[4.1978e-03, 9.4555e-01, 1.9557e-06, 5.0253e-02],
# [9.9994e-01, 5.5569e-05, 8.4751e-10, 1.3143e-06],
# [2.1349e-07, 1.1345e-06, 9.7019e-01, 2.9806e-02],
# ...,
# [2.1339e-07, 1.1339e-06, 9.7020e-01, 2.9798e-02],
# [9.9901e-01, 9.6573e-04, 6.9303e-09, 2.1945e-05],
# [7.2919e-04, 2.5484e-02, 3.3011e-02, 9.4078e-01]],
# grad_fn=<SoftmaxBackward0>)
= torch.concat([X,h,yhat],axis=1).data
mat 12],cmap="bwr",vmin=-1, vmax=1)
plt.matshow(mat[:
plt.colorbar()
plt.xticks(range(10),
r"$X_A$", r"$X_b$",r"$X_c$",r"$X_d$",
[r'$h_1$',r'$h_2$',
r'$\hat{y}_A$',r'$\hat{y}_b$',r'$\hat{y}_c$',r'$\hat{y}_d$']
;
)=3.5,color='lime')
plt.axvline(x=5.5,color='lime') plt.axvline(x
6. torch.nn.LSTM
1)
torch.manual_seed(= torch.nn.LSTM(
lstm = 4, # X.shape=(299,4)
input_size= 2, # h.shape=(299,2)
hidden_size = 1, # 우리수업에서는 그냥1
num_layers = False # 우리수업에서는 항상 False
bidirectional
)= torch.nn.Linear(2,4)
cook = torch.nn.CrossEntropyLoss()
loss_fn = torch.optim.Adam(list(lstm.parameters())+list(cook.parameters()),lr=0.1) optimizr
for epoc in range(200):
## 1
= lstm(X)
h, _ = cook(h)
out ## 2
= loss_fn(out,y)
loss ## 3
loss.backward()## 4
optimizr.step() optimizr.zero_grad()
= torch.nn.functional.softmax(out,dim=1) yhat
= torch.concat([X,h,yhat],axis=1).data
mat 12],cmap="bwr",vmin=-1, vmax=1)
plt.matshow(mat[:
plt.colorbar()
plt.xticks(range(10),
r"$X_A$", r"$X_b$",r"$X_c$",r"$X_d$",
[r'$h_1$',r'$h_2$',
r'$\hat{y}_A$',r'$\hat{y}_b$',r'$\hat{y}_c$',r'$\hat{y}_d$']
;
)=3.5,color='lime')
plt.axvline(x=5.5,color='lime') plt.axvline(x
A1. 자잘한 용어 정리 (\(\star\))
A. \({\bf X}\), \({\bf y}\)
-
X, y를 지칭하는 이름
구분 | 용어 | 설명 |
---|---|---|
X | 설명변수 | 종속변수(반응변수)를 설명하거나 예측하는 데 사용되는 변수로, 전통 통계 및 머신러닝에서의 입력 역할 |
독립변수 (Independent Variable) | 전통적인 통계학 및 회귀 분석 문맥에서 사용됨 | |
입력변수 (Input Variable) | 머신러닝 모델에서 입력 데이터로 사용되며, 특히 신경망 구조 등에서 많이 쓰임 | |
특징 / 특성 (Feature) | 머신러닝, 데이터마이닝, 딥러닝 등에서 데이터를 구성하는 속성 또는 설명 변수로 사용됨 | |
예측 변수 (Predictor) | 예측 모델 설계 시 독립변수를 지칭하는 용어로, 모델링/통계 분석 문맥에서 흔히 사용됨 | |
공변량 (Covariate) | 실험 디자인, 특히 임상연구나 사회과학 연구에서 제어 변수로 사용됨 | |
y | 반응변수 | 독립변수의 영향을 받는 결과 변수로, 모델링이나 인과 추론에서 핵심적인 대상 |
종속변수 (Dependent Variable) | 전통 통계학과 회귀분석에서 사용되며, 독립변수의 영향을 받는 변수로 정의됨 | |
출력변수 (Output Variable) | 머신러닝 및 딥러닝에서 모델의 예측 결과로 출력되는 값으로 사용됨 | |
타겟 / 정답 (Target / Label) | 지도학습에서 모델이 학습해야 하는 실제 정답값을 의미하며, 분류/회귀 문제에 공통적으로 사용됨 |
B. 지도학습
-
우리가 수업에서 다루는 데이터는 주로 아래와 같은 느낌이다.
데이터는 \((X,y)\)의 형태로 정리되어 있다.
\(y\)는 우리가 관심이 있는 변수이다. 즉 우리는 \(y\)를 적절하게 추정하는 것에 관심이 있다.
\(X\)는 \(y\)를 추정하기 위해 필요한 정보이다.
\(X\) | \(y\) | 비고 | 순서 | 예시 |
---|---|---|---|---|
기온(온도) | 아이스 아메리카노 판매량 | 회귀 | 상관없음 | 날씨가 판매량에 미치는 영향 분석 |
스펙 | 합격 여부 | 로지스틱 | 상관없음 | 입사 지원자의 합격 예측 |
이미지 | 카테고리 | 합성곱신경망 (CNN) | 상관없음 | 개/고양이 이미지 구분 |
유저, 아이템 정보 | 평점 | 추천시스템 | 상관없음 | 넷플릭스 영화 추천 |
처음 \(m\)개의 단어(문장) | 이후 1개의 단어(문장) | 순환신경망 (RNN) | 순서 상관 있음 | 챗봇, 문장 생성, 언어 모델링 |
처음 \(m\)개의 단어(문장) | 카테고리 | 순환신경망 (RNN) | 순서 상관 있음 | 영화리뷰 감정 분류 |
-
이러한 문제상황, 즉 \((X,y)\)가 주어졌을때 \(X \to y\)를 추정하는 문제를 supervised learning 이라한다.
C. 모델이란?
-
통계학에서 모델은 y와 x의 관계를 의미하며 오차항의 설계를 포함하는 개념이다. 이는 통계학이 “데이터 = 정보 + 오차”의 관점을 유지하기 때문이다. 따라서 통계학에서 모델링이란
\[y_i = net(x_i) + \epsilon_i\]
에서 (1) 적절한 함수 \(net\)를 선택하는 일 (2) 적절한 오차항 \(\epsilon_i\) 을 설계하는일 모두를 포함한다.
-
딥러닝 혹은 머신러닝에서 모델은 단순히
\[y_i \approx net(x_i)\]
를 의미하는 경우가 많다. 즉 “model=net”라고 생각해도 무방하다. 이 경우 “모델링”이란 단순히 적절한 \(net\)을 설계하는 것만을 의미할 경우가 많다.
-
그래서 생긴일
- 통계학교재 특징: 분류문제와 회귀문제를 엄밀하게 구분하지 않는다. 사실 오차항만 다를뿐이지 크게보면 같은 회귀모형이라는 관점이다. 그래서 일반화선형모형(GLM)이라는 용어를 쓴다.
- 머신러닝/딥러닝교재 특징: 회귀문제와 분류문제를 구분해서 설명한다. (표도 만듦) 이는 오차항에 대한 기술을 모호하게 하여 생기는 현상이다.
D. 학습이란?
-
학습이란 주어진 자료 \((X,y)\)를 잘 분석하여 \(X\)에서 \(y\)로 가는 어떠한 “규칙” 혹은 “원리”를 찾는 것이다.
- 학습이란 주어진 자료 \((X,y)\)를 잘 분석하여 \(X\)에서 \(y\)로 가는 어떠한 “맵핑”을 찾는 것이다.
- 학습이란 주어진 자료 \((X,y)\)를 잘 분석하여 \(X\)에서 \(y\)로 가는 어떠한 “함수”을 찾는 것이다. 즉 \(y\approx f(X)\)가 되도록 만드는 \(f\)를 잘 찾는 것이다. (이 경우 “함수를 추정한다”라고 표현)
- 학습이란 주어진 자료 \((X,y)\)를 잘 분석하여 \(X\)에서 \(y\)로 가는 어떠한 “모델” 혹은 “모형”을 찾는 것이다. 즉 \(y\approx model(X)\)가 되도록 만드는 \(model\)을 잘 찾는 것이다. (이 경우 “모형을 학습시킨다”라고 표현)
- 학습이란 주어진 자료 \((X,y)\)를 잘 분석하여 \(X\)에서 \(y\)로 가는 어떠한 “네트워크”을 찾는 것이다. 즉 \(y\approx net(X)\)가 되도록 만드는 \(net\)을 잘 찾는 것이다. (이 경우 “네트워크를 학습시킨다”라고 표현)
-
prediction이란 학습과정에서 찾은 “규칙” 혹은 “원리”를 \(X\)에 적용하여 \(\hat{y}\)을 구하는 과정이다. 학습과정에서 찾은 규칙 혹은 원리는 \(f\),\(model\),\(net\) 으로 생각가능한데 이에 따르면 아래가 성립한다.
- \(\hat{y} = f(X)\)
- \(\hat{y} = model(X)\)
- \(\hat{y} = net(X)\)
E. \(\hat{y}\)를 부르는 다양한 이름
-
\(\hat{y}\)는 \(X\)가 주어진 자료에 있는 값인지 아니면 새로운 값 인지에 따라 지칭하는 이름이 미묘하게 다르다.
\(X \in data\): \(\hat{y}=net(X)\) 는 predicted value, fitted value 라고 부른다.
\(X \notin data\): \(\hat{y}=net(X)\) 는 predicted value, predicted value with new data 라고 부른다.
F. 다양한 코드들
-
파이썬 코드..
#Python
# autogluon 에서 "학습"을 의미하는 과정
predictor.fit(X,y) # sklearn 에서 "학습"을 의미하는 과정
model.fit(X,y) # huggingface 에서 "학습"을 의미하는 과정
trainer.train() # huggingface 에서 "예측"을 의미하는 과정
trainer.predict(dataset) =32, epochs=10) # keras에서 "학습"을 의미하는 과정
model.fit(x, y, batch_size# keras에서 "예측"을 의미하는 과정 model.predict(test_img)
-
R 코드..
# R
<- lm(y~x) # 선형회귀분석에서 학습을 의미하는 함수
ols $fitted.values # 선형회귀분석에서 yhat을 출력
olspredict(ols, newdata=test) # 선형회귀분석에서 test에 대한 예측값을 출력하는 함수
$coef # 선형회귀분석에서 weight를 확인하는 방법 ols
A2. 신경망관련 용어
-
은근히 용어가 헷갈리는데, 뜻을 좀 살펴보자.
- ANN: 인공신경망
- MLP: 다층퍼셉트론 (레이어가 여러개 있어요)
- DNN: 깊은신경망, 심층신경망
- CNN: 합성곱신경망
- RNN: 순환신경망
# 예시1
– MLP, DNN
= torch.nn.Sequential(
net =1,out_features=2),
torch.nn.Linear(in_features
torch.nn.ReLU(),=2,out_features=2),
torch.nn.Linear(in_features
torch.nn.ReLU(),=2,out_features=1),
torch.nn.Linear(in_features
torch.nn.Sigmoid() )
- ANN: O
- MLP: O
- DNN: O
- CNN: X (합성곱레이어가 없으므로)
- RNN: X (순환구조가 없으므로)
#
# 예시2
– MLP, Shallow Network
= torch.nn.Sequential(
net =1,out_features=2),
torch.nn.Linear(in_features
torch.nn.ReLU(),=2,out_features=1),
torch.nn.Linear(in_features
torch.nn.Sigmoid() )
- ANN: O
- MLP: O
- DNN: X (깊은 신경망으로 생각하려면 더 많은 레이어가 필요함. 합의된 기준은 히든레이어 2장이상, 이걸 설명하기 위해서 얕은 신경망이란 용어도 씀)
- CNN: X (합성곱레이어가 없으므로)
- RNN: X (순환구조가 없으므로)
#
# 예시3
– MLP, DNN, Wide NN
= torch.nn.Sequential(
net =1,out_features=1048576),
torch.nn.Linear(in_features
torch.nn.ReLU(),=1048576,out_features=1048576),
torch.nn.Linear(in_features
torch.nn.ReLU(),=1048576,out_features=1),
torch.nn.Linear(in_features
torch.nn.Sigmoid(), )
- ANN: O
- MLP: O
- DNN: O (깊긴한데 이정도면 모양이 깊다기 보다는 넓은 신경망임, 그래서 어떤 연구에서는 이걸 넓은 신경망이라 부르기도 함)
- CNN: X (합성곱레이어가 없으므로)
- RNN: X (순환구조가 없으므로)
# 예시4
– CNN
= torch.nn.Sequential(
net # Layer1
1, 64, kernel_size=4, stride=2, padding=1, bias=False),
torch.nn.Conv2d(0.2),
torch.nn.LeakyReLU(# Layer2
64, 128, kernel_size=4, stride=2, padding=1, bias=False),
torch.nn.Conv2d(128),
torch.nn.BatchNorm2d(0.2),
torch.nn.LeakyReLU(# Layer3
128, 256, kernel_size=4, stride=2, padding=1, bias=False),
torch.nn.Conv2d(256),
torch.nn.BatchNorm2d(0.2),
torch.nn.LeakyReLU(# Layer4
256, 512, kernel_size=4, stride=2, padding=1, bias=False),
torch.nn.Conv2d(512),
torch.nn.BatchNorm2d(0.2),
torch.nn.LeakyReLU(# Layer5
512, 1, kernel_size=4, stride=1, padding=0, bias=False),
torch.nn.Conv2d(
torch.nn.Sigmoid(),
torch.nn.Flatten() )
- ANN: O
- MLP: X (합성곱연결이 포함되어있으므로, MLP가 아님, 완전연결만 포함해야 MLP임)
- DNN: O
- CNN: O (합성곱레이어를 포함하고 있으므로)
- RNN: X (순환구조가 없으므로)
#
# 예시5
– CNN
= torch.nn.Sequential(
net 1,16,(5,5)),
torch.nn.Conv2d(
torch.nn.ReLU(),2,2)),
torch.nn.MaxPool2d((
torch.nn.Flatten(),2304,1),
torch.nn.Linear(
torch.nn.Sigmoid() )
- ANN: O
- MLP: X
- DNN: X? (히든레이어가 1장이므로..)
- CNN: O (합성곱레이어를 포함하고 있으므로)
- RNN: X (순환구조가 없으므로)
근데 대부분의 문서에서는 CNN, RNN은 DNN의 한 종류로 설명하고 있어서요.. 이런 네트워크에서는 개념충돌이 옵니다.
#
# 예시6
– RNN
class Net(torch.nn.Module):
def __init__(self):
super().__init__()
self.rnn = torch.nn.RNN(4,2)
self.linr = torch.nn.Linear(2,2)
def forward(self,X):
= self.rnn(X)
h,_ = self.linr(h)
netout return netout
= Net() net
- ANN: O
- MLP: X
- DNN: X? (히든레이어가 1장이므로..)
- CNN: X (합성곱레이어가 없으므로)
- RNN: O
이것도 비슷한 개념충돌
#
A3. 학습
-
모든 인공지능 관련 알고리즘은 아래의 분류로 가능함.
특징 | 지도학습 (Supervised Learning) | 비지도학습 (Unsupervised Learning) | 강화학습 (Reinforcement Learning) |
---|---|---|---|
정의 | 입력 데이터와 정답(레이블)을 사용 | 입력 데이터만 사용 | 에이전트가 환경과 상호작용하며 학습 |
목표 | 입력에 대한 정확한 출력을 예측 | 데이터의 숨겨진 구조나 패턴 발견 | 최대 보상을 얻기 위한 최적의 정책 학습 |
예시 | 이미지 분류, 스팸 필터링 | 군집화, 차원 축소 | 게임 플레이, 로봇 제어 |
주요 알고리즘 | 선형 회귀, 로지스틱 회귀, SVM | K-평균, PCA, 오토인코더 | Q-러닝, DQN |
활용 | 분류, 예측 | 데이터의 숨겨진 패턴 발견 | 복잡한 의사결정 문제 해결 가능 |
데이터 요구사항 | 레이블링이 반드시 필요 | 많은 양의 데이터 필요 | 시뮬레이션 또는 실제 환경 필요 |
-
그런데 분류가 애매한 것들이 점점 많아짐.