#1. 체인룰과 역전파기법

주어진 자료가 아래와 같다고 하자.

  • ${\bf X} = \begin{bmatrix} 1 & 2.1 \\ 1 & 3.0 \end{bmatrix}$

  • ${\bf y} = \begin{bmatrix} 3.0 \\ 5.0 \end{bmatrix}$

손실함수의 정의가 아래와 같다고 하자.

$$loss={\bf v}^\top {\bf v}$$

이때 ${\bf v}= {\bf y}-{\bf u}$ 이고 ${\bf u}= {\bf X}{\bf W}$ 이다. ${\bf W} =\begin{bmatrix} 0.5 \\ 0.6 \end{bmatrix}$ 지점에서의 $\frac{\partial}{\partial {\bf W}}loss$를 역전파 기법을 이용하여 구하고 파이토치의 backward()를 이용하여 검증하라. 즉 (1)-(6)을 계산하라.

(1) 파이토치를 이용하여 순전파를 계산하라. 즉 ${\bf u}$를 계산하라.

(2) 파이토치를 이용하여 오차를 계산하라. 즉 ${\bf v}$를 계산하라.

(3) 파이토치를 이용하여 오차제곱합을 계산하라. 즉 $loss={\bf v}^\top {\bf v}$를 계산하라.

(4) $\frac{\partial}{\partial {\bf v}} loss$ 를 해석적으로 계산하라(=이론적인 값을 계산하라). 파이토치를 이용하여 검증하라.

(5)$\frac{\partial }{\partial {\bf u}}{\bf v}^\top$와 $\frac{\partial }{\partial {\bf W}}{\bf u}^\top$의 값을 해석적으로 계산하라. (파이토치를 이용한 검증은 불필요)

(6) (4)~(5)의 결과와 체인룰을 이용하여 $\frac{\partial}{\partial {\bf W}}loss$를 계산하라. 그리고 아래의 코드를 이용하여 검증하라.

import torch
ones= torch.ones(2)
x = torch.tensor([2.1,3.0])
X = torch.vstack([ones,x]).T
y = torch.tensor([3.0,5.0])
W = torch.tensor([0.5,0.6],requires_grad=True) 
loss = (y-X@W).T @ (y-X@W)
loss.backward()
W.grad.data

#2. 음료추천

아래는 200명의 사용자가 차가운커피, 따뜻한커피, 차가운홍차, 따듯한홍차 각 10종씩을 먹고 평점을 넣은 자료이다.

df = pd.read_csv("https://raw.githubusercontent.com/guebin/2021BDA/master/_notebooks/2021-12-04-recommend.csv")
df
user item rating item_name
0 1 27 2.677878 차가운홍차7
1 1 28 2.382410 차가운홍차8
2 1 38 0.952034 따뜻한홍차8
3 1 21 2.359307 차가운홍차1
4 1 24 2.447412 차가운홍차4
... ... ... ... ...
3995 200 28 2.401077 차가운홍차8
3996 200 31 3.798483 따뜻한홍차1
3997 200 22 2.104705 차가운홍차2
3998 200 26 2.248165 차가운홍차6
3999 200 39 4.007320 따뜻한홍차9

4000 rows × 4 columns

(1) user-item matrix 생성하라.

생성예시는 아래와 같다.

차가운커피1 차가운커피2 차가운커피3 차가운커피4 차가운커피5 차가운커피6 차가운커피7 차가운커피8 차가운커피9 차가운커피10 따듯한커피1 따듯한커피2 따듯한커피3 따듯한커피4 따듯한커피5 따듯한커피6 따듯한커피7 따듯한커피8 따듯한커피9 따듯한커피10 차가운홍차1 차가운홍차2 차가운홍차3 차가운홍차4 차가운홍차5 차가운홍차6 차가운홍차7 차가운홍차8 차가운홍차9 차가운홍차10 따뜻한홍차1 따뜻한홍차2 따뜻한홍차3 따뜻한홍차4 따뜻한홍차5 따뜻한홍차6 따뜻한홍차7 따뜻한홍차8 따뜻한홍차9 따뜻한홍차10
user1 None 3.937672 None 3.989888 4.133222 None None None None 4.015579 2.103387 2.361724 None 2.273406 2.295347 None None None 2.791477 None 2.359307 2.565654 None 2.447412 None None 2.677878 2.38241 2.194201 None None None None None 0.887225 1.014088 None 0.952034 0.658081 1.235058
user2 4.098147 4.094224 None 3.765555 None None 3.988153 None 4.349755 3.640496 None None 2.707521 2.765143 2.310812 2.458836 None None None 2.22282 2.621137 None 2.510424 None None None 2.788081 None 2.404252 2.908625 None 1.400812 None 0.654011 None 1.129268 None None 0.703928 None
user3 3.819119 None 4.228748 3.79414 None 4.08909 3.776395 None 4.583121 None None 2.7361 None 2.219188 None None None None 2.791662 None 2.729578 None None None None None None None 2.494008 2.440778 0.695669 None 0.840201 0.960158 None 1.019722 1.287193 1.354343 1.237186 0.985125
user4 4.243031 3.985556 4.3557 4.200771 None 4.068798 None None None 4.149567 None None 2.466804 None None 2.104525 2.341672 2.463411 2.56218 None None None 2.37737 2.37356 None 2.317104 2.5877 None None None 1.014652 None None None None None 1.09685 0.664659 1.148056 1.302336
user5 3.855109 None None None None 3.772252 4.18115 4.077935 None 3.905809 2.566041 2.412227 None None None 2.715758 None None 2.651073 None 2.454781 2.654822 2.382804 None None None 2.599824 None None None 0.851721 1.313315 None 1.093123 None 0.759305 1.336896 None 0.742396 1.064772
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
user196 0.788662 0.704273 0.776555 0.8481 None None None 0.686273 None None 2.164656 2.549222 2.614974 None None None None None 2.51912 2.355786 2.509917 2.382942 2.494133 None None None None None 2.457732 None 4.014754 4.184846 None 4.126758 None None 4.364885 None 3.767153 4.405117
user197 1.303235 1.43626 1.00433 None None None 1.486788 1.295232 None 0.920782 2.511827 None 2.361798 None 2.354619 None None None None 2.21937 2.401316 None None None None None 2.793289 None 2.464333 2.426258 4.253895 None None 4.369466 None 3.996908 3.853673 None 3.917286 4.57724
user198 1.251698 None 1.017147 None None None None None None 0.806444 None 2.520115 2.646957 None 2.952988 None None 2.190244 None None 2.282611 None 2.480411 2.663661 2.402259 None None 2.708267 2.109672 2.824608 4.380199 4.022162 None 3.895619 None 3.887536 None 3.862879 None 4.261574
user199 1.007993 None 0.955789 None 0.846838 None 0.58893 1.046728 None 1.139212 2.739859 2.459454 None None None 2.430707 None 2.413188 2.608065 None None 2.764538 2.389897 2.29379 None 2.428555 2.406729 2.507149 None None None 4.039527 None None 3.837071 4.103043 None None None None
user200 0.717826 None 1.23011 None 0.994098 None None None 1.14695 None None None None None None 2.487716 2.56307 None None 2.300041 2.552453 2.104705 2.862709 2.416833 None 2.248165 2.401267 2.401077 None 2.21877 3.798483 None 4.224537 None None 4.117838 None 3.920277 4.00732 None

(2) 첫번째 유저를 평점을 조회하고 이 유저의 취향을 서술하라. 커피와 홍차중 어떤음료를 선호하는가? 따듯한 음료와 차가운 음료중 어떤 음료를 선호하는가?

(3) fastai를 이용하여 추천모형을 학습하라. (nn을 사용하지 않아도 무방하다.)

(4) (3)의 추천시스템을 이용하여 모든 음료(총40개)에 대하여 144번 유저의 fitted rating 을 구하라. 144번 유저는 어떤 취향인가?

(5) 차가운커피1에 대한 모든유저(총200명)의 fitted rating을 구하라. 몇번부터 몇번까지의 유저가 차가운 커피를 선호하는가?

#3. 영화추천

아래의 코드를 이용하여 자료를 받고 df를 만든뒤 물음에 답하라.

path = untar_data(URLs.ML_100k) 
ratings=pd.read_csv(path/'u.data', delimiter='\t', header=None, names=['user','movie','rating','timestamp'])
movies = pd.read_csv(path/'u.item', delimiter='|', encoding='latin-1', usecols=(0,1), names=('movie','title'), header=None)
df = ratings.merge(movies)

(1) fastai를 이용하여 추천모형을 학습하라. (nn을 사용하지 않아도 무방하다.)

(2) 아래의 영화들에 대한 30번유저의 fitted rating을 구하라.

1461    Terminator 2: Judgment Day (1991)
1462               Terminator, The (1984)

#4. 다음을 읽고 물음에 답하라. (O/X로 답할것)

(1) 학습이 진행됨에 따라 training loss는 줄어들지만 validation loss가 증가하는 현상을 기울기소실문제라고 한다.

(2) 배치정규화는 기울기소실문제를 해결하는 방법 중 하나이다.

(3) 기울기소실은 얕은신경망보다 깊은신경망에서 자주 발생한다.

(4) 역전파기법은 과적합을 방지하는 테크닉중 하나이다.

(5) 순전파만 계산하고 싶을 경우 GPU메모리에 각 층의 계산결과를 저장할 필요가 없다.