기계학습 (0921) 3주차

딥러닝 기초
회귀분석 선형모형
손실함수
경사하강법
Author

김보람

Published

September 21, 2022

imports

import torch
import numpy as np
import matplotlib.pyplot as plt 

로드맵

- 회귀분석 \(\to\) 로지스틱 \(\to\) 심층신경망(DNN) \(\to\) 합성곱신경망(CNN)

- 강의계획서

ref

- 넘파이 문법이 약하다면? (reshape, concatenate, stack)

  1. reshape: 아래 링크의 넘파이공부 2단계 reshape 참고

https://guebin.github.io/IP2022/2022/04/06/(6%EC%A3%BC%EC%B0%A8)-4%EC%9B%946%EC%9D%BC.html

  1. concatenate, stack: 아래 링크의 넘파이공부 4단계 참고

https://guebin.github.io/IP2022/2022/04/11/(6%EC%A3%BC%EC%B0%A8)-4%EC%9B%9411%EC%9D%BC.html

회귀모형 소개

- model: \(y_i= w_0+w_1 x_i +\epsilon_i = 2.5 + 4x_i +\epsilon_i, \quad i=1,2,\dots,n\)

- model: \({\bf y}={\bf X}{\bf W} +\boldsymbol{\epsilon}\)

  • \({\bf y}=\begin{bmatrix} y_1 \\ y_2 \\ \dots \\ y_n\end{bmatrix}, \quad {\bf X}=\begin{bmatrix} 1 & x_1 \\ 1 & x_2 \\ \dots \\ 1 & x_n\end{bmatrix}, \quad {\bf W}=\begin{bmatrix} 2.5 \\ 4 \end{bmatrix}, \quad \boldsymbol{\epsilon}= \begin{bmatrix} \epsilon_1 \\ \dots \\ \epsilon_n\end{bmatrix}\)

회귀모형에서 데이터 생성

_rnt=torch.randn(100).sort() #100개의 난수 생성 .sort()는 정렬된 값 표현
type(_rnt) #type해보니까 모르는 거네? lengh를 보면 2니까 리스트를 해볼수 있음!
torch.return_types.sort
a,_ = _rnt[0], _rnt[1] #첫번쨰 원소가 a에 들어가고 두번째 원소가 언더바에 들어가게 된다.
x,_ = torch.randn(100).sort()
x     # X벡터 안에 들어가는 x1, x2, x3 ... 
tensor([-2.6694e+00, -2.6132e+00, -2.2525e+00, -2.0763e+00, -1.9791e+00,
        -1.8444e+00, -1.7486e+00, -1.7284e+00, -1.6991e+00, -1.6634e+00,
        -1.6364e+00, -1.5948e+00, -1.5710e+00, -1.5043e+00, -1.5002e+00,
        -1.4035e+00, -1.3328e+00, -1.3239e+00, -1.2964e+00, -1.2064e+00,
        -1.1857e+00, -1.1184e+00, -1.0559e+00, -1.0148e+00, -1.0105e+00,
        -9.7771e-01, -9.2156e-01, -8.9929e-01, -8.8333e-01, -7.6213e-01,
        -6.8896e-01, -6.2386e-01, -6.0660e-01, -5.9161e-01, -5.7884e-01,
        -4.4417e-01, -4.3631e-01, -3.8129e-01, -3.5062e-01, -3.4311e-01,
        -3.1632e-01, -2.7753e-01, -2.7065e-01, -2.7020e-01, -2.6189e-01,
        -2.2925e-01, -1.4359e-01, -1.2405e-01, -6.8853e-02, -5.1603e-02,
        -4.9887e-02, -2.3798e-02, -1.6275e-03,  7.4200e-02,  1.6760e-01,
         1.7279e-01,  2.3754e-01,  2.5730e-01,  2.6886e-01,  2.8250e-01,
         2.9296e-01,  3.0017e-01,  3.1466e-01,  3.2627e-01,  3.5380e-01,
         3.5664e-01,  3.6345e-01,  3.6429e-01,  4.3469e-01,  4.3551e-01,
         4.6556e-01,  4.9491e-01,  4.9940e-01,  5.4481e-01,  6.4859e-01,
         6.7236e-01,  6.8683e-01,  7.2763e-01,  7.3832e-01,  7.8508e-01,
         8.0376e-01,  8.1716e-01,  8.2234e-01,  8.8814e-01,  9.1453e-01,
         9.8436e-01,  1.0107e+00,  1.0332e+00,  1.0441e+00,  1.0577e+00,
         1.1333e+00,  1.1406e+00,  1.2557e+00,  1.3057e+00,  1.3221e+00,
         1.3361e+00,  1.6109e+00,  1.7063e+00,  1.8415e+00,  2.0672e+00])
ones= torch.ones(100)   #torch.ones(100) 1이 100개 들어간거. X벡터만들기 위해서 
torch.stack([ones, x]) #stack 쌓는다!!!   근데 우리가 원하는 건 이거의 T (트랜스)를 가지고 싶으니까 벡터T 해주기!
tensor([[ 1.0000e+00,  1.0000e+00,  1.0000e+00,  1.0000e+00,  1.0000e+00,
          1.0000e+00,  1.0000e+00,  1.0000e+00,  1.0000e+00,  1.0000e+00,
          1.0000e+00,  1.0000e+00,  1.0000e+00,  1.0000e+00,  1.0000e+00,
          1.0000e+00,  1.0000e+00,  1.0000e+00,  1.0000e+00,  1.0000e+00,
          1.0000e+00,  1.0000e+00,  1.0000e+00,  1.0000e+00,  1.0000e+00,
          1.0000e+00,  1.0000e+00,  1.0000e+00,  1.0000e+00,  1.0000e+00,
          1.0000e+00,  1.0000e+00,  1.0000e+00,  1.0000e+00,  1.0000e+00,
          1.0000e+00,  1.0000e+00,  1.0000e+00,  1.0000e+00,  1.0000e+00,
          1.0000e+00,  1.0000e+00,  1.0000e+00,  1.0000e+00,  1.0000e+00,
          1.0000e+00,  1.0000e+00,  1.0000e+00,  1.0000e+00,  1.0000e+00,
          1.0000e+00,  1.0000e+00,  1.0000e+00,  1.0000e+00,  1.0000e+00,
          1.0000e+00,  1.0000e+00,  1.0000e+00,  1.0000e+00,  1.0000e+00,
          1.0000e+00,  1.0000e+00,  1.0000e+00,  1.0000e+00,  1.0000e+00,
          1.0000e+00,  1.0000e+00,  1.0000e+00,  1.0000e+00,  1.0000e+00,
          1.0000e+00,  1.0000e+00,  1.0000e+00,  1.0000e+00,  1.0000e+00,
          1.0000e+00,  1.0000e+00,  1.0000e+00,  1.0000e+00,  1.0000e+00,
          1.0000e+00,  1.0000e+00,  1.0000e+00,  1.0000e+00,  1.0000e+00,
          1.0000e+00,  1.0000e+00,  1.0000e+00,  1.0000e+00,  1.0000e+00,
          1.0000e+00,  1.0000e+00,  1.0000e+00,  1.0000e+00,  1.0000e+00,
          1.0000e+00,  1.0000e+00,  1.0000e+00,  1.0000e+00,  1.0000e+00],
        [-2.6694e+00, -2.6132e+00, -2.2525e+00, -2.0763e+00, -1.9791e+00,
         -1.8444e+00, -1.7486e+00, -1.7284e+00, -1.6991e+00, -1.6634e+00,
         -1.6364e+00, -1.5948e+00, -1.5710e+00, -1.5043e+00, -1.5002e+00,
         -1.4035e+00, -1.3328e+00, -1.3239e+00, -1.2964e+00, -1.2064e+00,
         -1.1857e+00, -1.1184e+00, -1.0559e+00, -1.0148e+00, -1.0105e+00,
         -9.7771e-01, -9.2156e-01, -8.9929e-01, -8.8333e-01, -7.6213e-01,
         -6.8896e-01, -6.2386e-01, -6.0660e-01, -5.9161e-01, -5.7884e-01,
         -4.4417e-01, -4.3631e-01, -3.8129e-01, -3.5062e-01, -3.4311e-01,
         -3.1632e-01, -2.7753e-01, -2.7065e-01, -2.7020e-01, -2.6189e-01,
         -2.2925e-01, -1.4359e-01, -1.2405e-01, -6.8853e-02, -5.1603e-02,
         -4.9887e-02, -2.3798e-02, -1.6275e-03,  7.4200e-02,  1.6760e-01,
          1.7279e-01,  2.3754e-01,  2.5730e-01,  2.6886e-01,  2.8250e-01,
          2.9296e-01,  3.0017e-01,  3.1466e-01,  3.2627e-01,  3.5380e-01,
          3.5664e-01,  3.6345e-01,  3.6429e-01,  4.3469e-01,  4.3551e-01,
          4.6556e-01,  4.9491e-01,  4.9940e-01,  5.4481e-01,  6.4859e-01,
          6.7236e-01,  6.8683e-01,  7.2763e-01,  7.3832e-01,  7.8508e-01,
          8.0376e-01,  8.1716e-01,  8.2234e-01,  8.8814e-01,  9.1453e-01,
          9.8436e-01,  1.0107e+00,  1.0332e+00,  1.0441e+00,  1.0577e+00,
          1.1333e+00,  1.1406e+00,  1.2557e+00,  1.3057e+00,  1.3221e+00,
          1.3361e+00,  1.6109e+00,  1.7063e+00,  1.8415e+00,  2.0672e+00]])
type(torch.stack([ones, x]))
torch.Tensor
# 역슬래시 하고 입실론 쓰고 탭 누르면 입실론 수학기호생김 신기하군
W = torch.tensor([2.5,4])
W
W.shape #원래 shape이 매트릭스여야 하는데 벡터네? 그럼 X@W하면 매트릭스가 아닌 벡터가 된다. ~~~~~~~~~~ 2차원 1차원,,, 훔 
torch.Size([2])
torch.manual_seed(43052) #이건 원래 난수가 봅히는건뎅 교수님이 설명하기 편하게 ,, 숫자 정해논고
ones= torch.ones(100) #torch.ones(100) 1이 100개 들어간거. X벡터만들기 위해서 
x,_ = torch.randn(100).sort()
X = torch.stack([ones,x]).T # torch.stack([ones,x],axis=1)    T:트랜스포 해주는거. 근데 그렇게 안하고 axis=1해도 된당!
W = torch.tensor([2.5,4])
ϵ = torch.randn(100)*0.5
y = X@W + ϵ
plt.plot(x,y,'o')
plt.plot(x,2.5+4*x,'--') #트루펑션 점선으로 찍어보기

#언더라인펑션~= Y=4x+2.5 
# w0, w1를 추정하면 언더라인 펑션을 잘 추정했다고 확인 할 수 잇어염 

# 파란점은 기본 데이터. 입실론을 뺀거(오차항 뺸거)=TRUU FUNCTION을 찾고 싶어!

회귀모형에서 학습이란?

# x에서 y로가는 맵핑 
# 리니어 맵핑,, 2.5랑 4에 가깝게 맞추는거!!

- 파란점만 주어졌을때, 주황색 점선을 추정하는것. 좀 더 정확하게 말하면 given data로 \(\begin{bmatrix} \hat{w}_0 \\ \hat{w}_1 \end{bmatrix}\)를 최대한 \(\begin{bmatrix} 2.5 \\ 4 \end{bmatrix}\)와 비슷하게 찾는것.

  • given data : \(\big\{(x_i,y_i) \big\}_{i=1}^{n}\)

  • parameter: \({\bf W}=\begin{bmatrix} w_0 \\ w_1 \end{bmatrix}\)

  • estimated parameter: \({\bf \hat{W}}=\begin{bmatrix} \hat{w}_0 \\ \hat{w}_1 \end{bmatrix}\)

- 더 쉽게 말하면 아래의 그림을 보고 적당한 추세선을 찾는것이다.

# "적당한" 추세선이 뭐냐? 하면 웱,,
# 숫자로 만드는게 제일 편하다!!
# 적당한게 정도가 있어서 일단 안적당한 거 먼저 해볼게용
plt.plot(x,y,'o')
plt.plot(x, -5+10*x, '--')

# 원데이터가 y1, y2 되고.. 언더바에 잇는게 y1 hat, y2 hat ..... 

- 시도: \((\hat{w}_0,\hat{w}_1)=(-5,10)\)을 선택하여 선을 그려보고 적당한지 판단.

  • \(\hat{y}_i=-5 +10 x_i\) 와 같이 \(y_i\)의 값을 적합시키겠다는 의미

- 벡터표현으로 주황색점선을 계산

What= torch.tensor([-5.0, 10.0])
What
tensor([-5., 10.])
plt.plot(x,y,'o')
plt.plot(x,X@What,'--')

# 모델링: 데이터를 보고 아키텍처 설정,, 

파라메터를 학습하는 방법 (적당한 선으로 업데이트 하는 방법)

- 이론적으로 추론 <- 회귀분석시간에 배운것

- 컴퓨터의 반복계산을 이용하여 추론 (손실함수도입 + 경사하강법) <- 우리가 오늘 파이토치로 실습해볼 내용.

- 전략: 아래와 같은 3단계 전략을 취한다.

  • stage1: 아무 점선이나 그어본다..
  • stage2: stage1에서 그은 점선보다 더 좋은 점선으로 바꾼다.
  • stage3: stage1 - 2 를 반복한다.

Stage1: 첫번째 점선 – 임의의 선을 일단 그어보자

- \(\hat{w}_0=-5, \hat{w}_1 = 10\) 으로 설정하고 (왜? 그냥) 임의의 선을 그어보자.

What= torch.tensor([-5.0, 10.0], requires_grad=True)
What # 나중에 미분하기 위해서 requires_grad 필요한 옵션

# 뒤에 꼬리표가 붙어있음! 따라다녀,, 

#텐서플로우 패키지에서 tf.variable이랑 tf. 어ㅓㅉ고 랑 선언하는데 tf.variable로 설정한거
tensor([-5., 10.], requires_grad=True)
What + 1
# 뒤에 grad_fn 어쩌고가 따라오지만 신경쓰지 않아도 된당 ,, 벡터처럼 계산도 가능해!!
# 꼬리표를 빼고싶을땐...... 
What.detach()
What.data
tensor([-5., 10.])
  • 처음에는 ${}=

    \[\begin{bmatrix} \hat{w}_0 \\ \hat{w}_1 \end{bmatrix}\]

    =

    \[\begin{bmatrix} -5 \\ 10 \end{bmatrix}\]

    $ 를 대입해서 주황색 점선을 적당히 그려보자는 의미

  • 끝에 requires_grad=True는 나중에 미분을 위한 것

그려보자!

Stage2: 첫번째 수정 – 최초의 점선에 대한 ‘적당한 정도’를 판단하고 더 ’적당한’ 점선으로 업데이트 한다.

- ’적당한 정도’를 판단하기 위한 장치: loss function 도입!

\(loss=\sum_{i=1}^{n}(y_i-\hat{y}_i)^2=\sum_{i=1}^{n}(y_i-(\hat{w}_0+\hat{w}_1x_i))^2\)

\(=({\bf y}-{\bf\hat{y}})^\top({\bf y}-{\bf\hat{y}})=({\bf y}-{\bf X}{\bf \hat{W}})^\top({\bf y}-{\bf X}{\bf \hat{W}})\)

- loss 함수의 특징 - \(y_i \approx \hat{y}_i\) 일수록 loss값이 작다. - \(y_i \approx \hat{y}_i\) 이 되도록 \((\hat{w}_0,\hat{w}_1)\)을 잘 찍으면 loss값이 작다. - (중요) 주황색 점선이 ‘적당할 수록’ loss값이 작다.

# y와 yhat의 값이 비슷하면 loss값이 0에 가까워진다.
loss=torch.sum((y-X@What)**2) #이 값이 주황색 점선에 대한 loss!!!
loss
tensor(8587.6875, grad_fn=<SumBackward0>)

- 우리의 목표: 이 loss(=8587.6875)을 더 줄이자. - 궁극적으로는 아예 모든 조합 \((\hat{w}_0,\hat{w}_1)\)에 대하여 가장 작은 loss를 찾으면 좋겠다. (stage2에서 할일은 아님)

- 문제의 치환: 생각해보니까 우리의 문제는 아래와 같이 수학적으로 단순화 되었다. - 적당해보이는 주황색 선을 찾자 \(\to\) \(loss(w_0,w_1)\)를 최소로하는 \((w_0,w_1)\)의 값을 찾자.

- 수정된 목표: \(loss(w_0,w_1)\)를 최소로 하는 \((w_0,w_1)\)을 구하라. - 단순한 수학문제가 되었다. 마치 \(loss(w)=w^2-2w+3\) 을 최소화하는 \(w\)를 찾으라는 것과 같음. - 즉 “적당한 선으로 업데이트 하라 = 파라메터를 학습 하라 = 손실함수를 최소화 하라”

# 그 function을 minimize하는 정의역의 세트를 찾으면 된다. = 적당한 선으로 업데이트 하라= ...=

- 우리의 무기: 경사하강법, 벡터미분


Stage2를 위한 경사하강법 복습

경사하강법 아이디어 (1차원)

(step 1) 임의의 점을 찍는다.

(step 2) 그 점에서 순간기울기를 구한다. (접선) <– 미분

(step 3) 순간기울기(=미분계수)의 부호를 살펴보고 부호와 반대방향으로 움직인다.

(팁) 기울기의 절대값 크기와 비례하여 보폭(=움직이는 정도)을 조절한다.

# 접선의 기울기가 만약 -4 라는 음수가 나오면 양수값으로 가면 된다.. 
# 미분계수의 절대값이 작아지는 정도로.. 보폭 조절!!

경사하강법 아이디어 (2차원)

(step 1) 임의의 점을 찍는다.

(step 2) 그 점에서 순간기울기를 구한다. (접평면) <– 편미분

(step 3) 순간기울기(=미분계수)의 부호를 살펴보고 부호와 반대방향으로 각각 움직인다.

(팁) 기울기의 절대값 크기와 비례하여 보폭(=움직이는 정도)을 각각 조절한다.

# 왼쪽으로 갈래? 오른쪽으로 갈래?
# 위로 갈래? 아래로 갈래? ->점에서 한쪽방향을 고정되어있다 생각하고 왼오, 또는 위아래로만 -> 편미분으로 가넝!!
# 2차원, 3차원,, 원리는 결국 1차원과 똑같당!

loss를 줄이도록 \({\bf W}\)를 개선하는 방법

- $수정값 원래값 - 기울어진크기(=미분계수) $

  • 여기에서 \(\alpha\)는 전체적인 보폭의 크기를 결정한다. 즉 \(\alpha\)값이 클수록 한번의 update에 움직이는 양이 크다.
# 반대방향으로 가야하니까 - 를 붙인다. 
# a 알파값은 .. 만약 미분계수가 -8이 나왔엉. 근데 그렇다고 8곱해버리면 너무 크니까 0.8 이든 0.08이든.. 그런 알파값을 곱해줘야해!!

# a 값은 양수여야함!!! 음수면 방향이 바꾸기 때문에 a는 정답이 없어. 0.0001 이렇게 걍 맞춰가면 뎀..

- \({\bf W} \leftarrow {\bf W} - \alpha \times \frac{\partial}{\partial {\bf W}}loss(w_0,w_1)\)

  • 마이너스의 의미: 기울기의 부호를 보고 반대방향으로 움직여라.

  • \(\frac{\partial}{\partial {\bf W}}loss(w_0,w_1):\) 기울기의 절대값 크기와 비례하여 움직이는 정도를 조정하라.

  • \(\alpha\)의 의미: 전체적인 보폭의 속도를 조절, \(\alpha\)가 크면 전체적으로 빠르게 움직인다. 다리의 길이로 비유할 수 있다.


loss
tensor(8587.6875, grad_fn=<SumBackward0>)

- 우리의 목표: loss=8587.6875 인데, 이걸 줄이는 것이 목표라고 했었음. 이것을 줄이는 방법이 경사하강법이다.

- 경사하강법으로 loss를 줄이기 위해서는 \(\frac{\partial}{\partial {\bf W}}loss(w_0,w_1)\)의 계산이 필요한데, 이를 위해서 벡터미분이 필요하다. (loss.backward()로 하면된다)

What.grad
loss.backward()

# 자기 혼자 미분하고 결과값을 안보여죵  
# 뭘로 미분하라는거야? ->꼬리표 추적... What까지 가서 얘를 미분하라는 거구나 하고 미분해줌
X@What #꼬리표가 있어!!!
tensor([-29.8211, -28.6215, -24.9730, -21.2394, -19.7919, -19.6354, -19.5093,
        -19.4352, -18.7223, -18.0793, -16.9040, -16.0918, -16.0536, -15.8746,
        -14.4690, -14.3193, -13.6426, -12.8578, -12.5486, -12.4213, -11.9484,
        -11.1034, -10.8296, -10.6210, -10.5064, -10.0578,  -9.8063,  -9.7380,
         -9.7097,  -9.6756,  -8.8736,  -8.7195,  -8.6880,  -8.1592,  -7.7752,
         -7.7716,  -7.7339,  -7.7208,  -7.6677,  -7.1551,  -7.0004,  -6.8163,
         -6.7081,  -6.5655,  -6.4480,  -6.3612,  -6.0566,  -5.6031,  -5.5589,
         -5.2137,  -4.3446,  -4.3165,  -3.8047,  -3.5801,  -3.4793,  -3.4325,
         -2.3545,  -2.3440,  -1.8434,  -1.7799,  -1.5386,  -1.0161,  -0.8103,
          0.4426,   0.5794,   0.9125,   1.1483,   1.4687,   1.4690,   1.5234,
          1.6738,   2.0592,   2.1414,   2.8221,   3.1536,   3.6682,   4.2907,
          4.8037,   4.8531,   4.9414,   5.3757,   5.3926,   5.6973,   6.0239,
          6.1261,   6.5317,   7.2891,   8.4032,   8.4936,   9.2794,   9.9943,
         10.0310,  10.4369,  11.7886,  15.8323,  17.4440,  18.9350,  21.0560,
         21.0566,  21.6324], grad_fn=<MvBackward0>)
y-X@What #꼬리표가 있는 걸로 파생된 모든 것들은 다 꼬리표가 있땅
tensor([21.2791, 22.0448, 19.0234, 16.7600, 15.5403, 16.5028, 15.4853, 15.2491,
        15.3820, 15.8766, 14.8778, 13.5299, 14.7183, 13.8280, 14.0026, 12.9680,
        11.9954, 12.7489, 12.2415, 11.7914, 11.9046, 11.5198, 11.2462, 10.5267,
        10.7726, 10.5168, 10.6967, 10.6377, 10.3411, 11.0601,  9.6820,  9.9789,
         9.8090, 10.0825,  8.8370,  9.1268,  9.8500,  8.8644,  9.2922,  8.9190,
         8.6027,  8.5628,  7.6912,  8.3478,  8.5596,  9.2232,  8.1731,  7.1257,
         8.1160,  8.0498,  7.7402,  6.3844,  6.6187,  7.0653,  7.0851,  6.0290,
         5.2399,  6.2613,  5.4961,  5.8827,  5.8510,  4.4186,  4.0283,  4.1260,
         3.7978,  3.3949,  3.3412,  3.0141,  3.8481,  3.9753,  3.7895,  3.9736,
         3.1428,  2.2318,  2.3002,  2.3654,  1.4343,  0.9550,  1.3489,  1.6579,
         1.0864,  1.1214,  0.9873,  1.3258,  1.9648,  0.5476, -0.4224, -0.9803,
        -1.2392, -2.0827, -0.4937, -0.9971, -2.9482, -2.7127, -4.7377, -7.1180,
        -6.6685, -7.9578, -8.5098, -7.7984], grad_fn=<SubBackward0>)
  • loss.backward()의 의미: loss를 미분해라! 뭘로? requires_grad=True를 가진 텐서로!!

loss=torch.sum((y-yhat)**2)= torch.sum((y-X@What)**2)
# 이었고 
What=torch.tensor([-5.0,10.0],requires_grad=True)
# 이므로 결국 What으로 미분하라는 의미. 
# 미분한 식이 나오는 것이 아니고, 
# 그 식에 (-5.0, 10.0)을 대입한 계수값이 계산됨. 

- 위에서 loss.backward()의 과정은 미분을 활용하여 \((-5,10)\)에서의 순간기울기를 구했다는 의미임.

What.grad
tensor([-1342.2522,  1188.9305])

- (-5,10)에서 loss의 순간기울기 값은 What.grad로 확인가능하다.

  • 이것이 의미하는건 \((-5,10)\)에서의 \(loss(w_0,w_1)\)의 순간기울기가 \((-1342.2523, 1188.9307)\) 이라는 의미

- (확인1) loss.backward()가 미분을 잘 계산해 주는 것이 맞는가? 손계산으로 검증하여 보자.

  • \(loss(w_0,w_1)=({\bf y}-\hat{\bf y})^\top ({\bf y}-\hat{\bf y})=({\bf y}-{\bf XW})^\top ({\bf y}-{\bf XW})\)

  • \(\frac{\partial}{\partial {\bf W} }loss(w_0,w_1)=-2{\bf X}^\top {\bf y}+2{\bf X}^\top {\bf X W}\)

- 2 * X.T @ y + 2 * X.T @ X @ What
tensor([-1342.2523,  1188.9305], grad_fn=<AddBackward0>)

- (확인2) loss.backward()가 미분을 잘 계산해 주는 것이 맞는가? 편미분을 간단히 구현하여 검증하여 보자.

  • \(\frac{\partial}{\partial {\bf W} } loss(w_0,w_1)=\begin{bmatrix}\frac{\partial}{\partial w_0} \\ \frac{\partial}{\partial w_1} \end{bmatrix}loss(w_0,w_1) =\begin{bmatrix}\frac{\partial}{\partial w_0}loss(w_0,w_1) \\ \frac{\partial}{\partial w_1}loss(w_0,w_1) \end{bmatrix}\)

  • \(\frac{\partial}{\partial w_0}loss(w_0,w_1) \approx \frac{loss(w_0+h,w_1)-loss(w_0,w_1)}{h}\)

  • \(\frac{\partial}{\partial w_1}loss(w_0,w_1) \approx \frac{loss(w_0,w_1+h)-loss(w_0,w_1)}{h}\)

_lossfn = lambda w0,w1: torch.sum((y-w0-w1*x)**2)
_lossfn(-5,10)
tensor(8587.6875)
h=0.001
(_lossfn(-5+h,10) - _lossfn(-5,10))/h,  (_lossfn(-5,10+h) - _lossfn(-5,10))/h
(tensor(-1341.7968), tensor(1190.4297))
  • 약간 오차가 있지만 얼추비슷 \(\to\) 잘 계산했다는 소리임

- 수정전, 수정하는폭, 수정후의 값은 차례로 아래와 같다.

What.data
tensor([-5., 10.])
str(What.data) #문자열이 됨! 
'tensor([-5., 10.])'
alpha=0.001 
print('수정전: ' + str(What.data)) # What 에서 미분꼬리표를 떼고 싶다면? What.data or What.detach()
print('수정하는폭: ' +str(-alpha * What.grad)) #1341*0.001, 1190*0.001
print('수정후: ' +str(What.data-alpha * What.grad))
print('*참값: (2.5,4)' )
수정전: tensor([-5., 10.])
수정하는폭: tensor([ 1.3423, -1.1889])
수정후: tensor([-3.6577,  8.8111])
*참값: (2.5,4)

- Wbefore, Wafter 계산

Wbefore = What.data
Wafter = What.data- alpha * What.grad
Wbefore, Wafter
(tensor([-5., 10.]), tensor([-3.6577,  8.8111]))

- Wbefore, Wafter의 시각화

plt.plot(x,y,'o')
plt.plot(x,X@Wbefore,'--')  #주황색
plt.plot(x,X@Wafter,'--')  #초록색

Stage3: Learn (=estimate \(\bf\hat{W})\)

- 이 과정은 Stage1,2를 반복하면 된다.

What= torch.tensor([-5.0,10.0],requires_grad=True) 
What
tensor([-5., 10.], requires_grad=True)
alpha=0.001 
for epoc in range(30): ## 30번 반복합니다!! 
    yhat=X@What 
    loss=torch.sum((y-yhat)**2)
    loss.backward() #미분.. what.grad로 미분이 된 것을 볼 수 있따->편미분계수값
    What.data = What.data-alpha * What.grad #경사하강법~~
    What.grad=None  # 파이토치 특징.. 미분된 grad값에 새 미분값이 안들어가있고.. 이전미분값에 그다음미분값이 더해져서 들어가기 때문에->defalut기 대문에 초기상태로 바꿔줘야햄....
What
tensor([2.4290, 4.0144], requires_grad=True)
  • 원래 철자는 epoch이 맞아요

- 반복결과는?! (최종적으로 구해지는 What의 값은?!) - 참고로 true

What.data ## true인 (2.5,4)와 상당히 비슷함
tensor([2.4290, 4.0144])

- 반복결과를 시각화하면?

plt.plot(x,y,'o')
plt.plot(x,X@What.data,'--') #그림을 그리기위해서 꼬리표를 떼준당..

파라메터의 학습과정 음미 (학습과정 모니터링)

학습과정의 기록

- 기록을 해보자.

loss_history = [] # 기록하고 싶은것 1  .
yhat_history = [] # 기록하고 싶은것 2  yhat이 어떻게 변하는지
What_history = [] # 기록하고 싶은것 3 
#loss_history #처음엔 비어있지만.. 값을 점점 넣고 싶어!!!
#loss_history.append(loss)
#loss_history
#loss.item()
#loss_history.append(loss.item())
#loss_history # 텐서를 리스트로 바꿔줘서 넣어주기..
What= torch.tensor([-5.0,10.0],requires_grad=True)
alpha=0.001 
for epoc in range(30): 
    yhat=X@What ; yhat_history.append(yhat.data.tolist())  #세미콜론만 주석처리하면.. 위랑 똑같은 코드..
    loss=torch.sum((y-yhat)**2); loss_history.append(loss.item())
    loss.backward() 
    What.data = What.data-alpha * What.grad; What_history.append(What.data.tolist())
    What.grad=None
loss_history
[8587.6875,
 5675.2109375,
 3755.637451171875,
 2489.581787109375,
 1654.0390625,
 1102.3206787109375,
 737.8441162109375,
 496.96514892578125,
 337.7142028808594,
 232.39694213867188,
 162.72906494140625,
 116.63263702392578,
 86.1263656616211,
 65.93397521972656,
 52.566444396972656,
 43.71583557128906,
 37.855220794677734,
 33.974090576171875,
 31.403636932373047,
 29.701112747192383,
 28.57339096069336,
 27.826366424560547,
 27.331483840942383,
 27.003639221191406,
 26.78643798828125,
 26.642536163330078,
 26.547197341918945,
 26.48402976989746,
 26.442174911499023,
 26.414440155029297]

- \(\hat{y}\) 관찰 (epoch=3, epoch=10, epoch=15)

yhat_history
[[-29.821128845214844,
  -28.621461868286133,
  -24.97295379638672,
  -21.239360809326172,
  -19.791915893554688,
  -19.635364532470703,
  -19.50925064086914,
  -19.435216903686523,
  -18.722301483154297,
  -18.079282760620117,
  -16.903972625732422,
  -16.09178924560547,
  -16.053556442260742,
  -15.874590873718262,
  -14.468965530395508,
  -14.31933879852295,
  -13.642648696899414,
  -12.857781410217285,
  -12.548619270324707,
  -12.421306610107422,
  -11.94838809967041,
  -11.103449821472168,
  -10.829590797424316,
  -10.621047973632812,
  -10.506429672241211,
  -10.05777359008789,
  -9.80626392364502,
  -9.737953186035156,
  -9.709654808044434,
  -9.67557144165039,
  -8.873588562011719,
  -8.719473838806152,
  -8.687962532043457,
  -8.159214973449707,
  -7.775153636932373,
  -7.771570682525635,
  -7.733872890472412,
  -7.7207512855529785,
  -7.667671203613281,
  -7.155084609985352,
  -7.000405311584473,
  -6.816307067871094,
  -6.708141326904297,
  -6.565457820892334,
  -6.4479804039001465,
  -6.361170768737793,
  -6.056612968444824,
  -5.603134632110596,
  -5.558872222900391,
  -5.213672637939453,
  -4.34455680847168,
  -4.3164825439453125,
  -3.8046953678131104,
  -3.5801002979278564,
  -3.479255437850952,
  -3.4324843883514404,
  -2.3544726371765137,
  -2.3440215587615967,
  -1.843425989151001,
  -1.7798891067504883,
  -1.5385699272155762,
  -1.016080617904663,
  -0.8102789521217346,
  0.44257819652557373,
  0.5793601274490356,
  0.9125399589538574,
  1.1482644081115723,
  1.468665599822998,
  1.468990445137024,
  1.5233922004699707,
  1.673753261566162,
  2.059195041656494,
  2.141373634338379,
  2.8221492767333984,
  3.1536107063293457,
  3.6682331562042236,
  4.290748119354248,
  4.803698539733887,
  4.853081226348877,
  4.9413557052612305,
  5.375688076019287,
  5.392560005187988,
  5.697267055511475,
  6.023870468139648,
  6.126120090484619,
  6.531744956970215,
  7.289087772369385,
  8.403202056884766,
  8.493597030639648,
  9.279403686523438,
  9.994264602661133,
  10.030980110168457,
  10.436870574951172,
  11.788615226745605,
  15.832330703735352,
  17.444000244140625,
  18.93501091003418,
  21.05604362487793,
  21.05657958984375,
  21.632400512695312],
 [-25.527816772460938,
  -24.470781326293945,
  -21.25605583190918,
  -17.96636199951172,
  -16.691007614135742,
  -16.553070068359375,
  -16.44194793701172,
  -16.37671661376953,
  -15.748562812805176,
  -15.181994438171387,
  -14.1464204788208,
  -13.430801391601562,
  -13.397112846374512,
  -13.239425659179688,
  -12.000919342041016,
  -11.869081497192383,
  -11.272846221923828,
  -10.581294059753418,
  -10.30888843536377,
  -10.196712493896484,
  -9.780020713806152,
  -9.035539627075195,
  -8.794240951538086,
  -8.610491752624512,
  -8.509501457214355,
  -8.114187240600586,
  -7.892580509185791,
  -7.832390785217285,
  -7.807457447052002,
  -7.777426242828369,
  -7.070793151855469,
  -6.935001850128174,
  -6.907237529754639,
  -6.441354274749756,
  -6.102954864501953,
  -6.09979772567749,
  -6.066582202911377,
  -6.055020809173584,
  -6.008251190185547,
  -5.556607723236084,
  -5.420318603515625,
  -5.258108615875244,
  -5.1628031730651855,
  -5.037083625793457,
  -4.933573246002197,
  -4.85708475112915,
  -4.588736534118652,
  -4.189174175262451,
  -4.150174140930176,
  -3.8460164070129395,
  -3.0802321434020996,
  -3.0554959774017334,
  -2.6045565605163574,
  -2.4066641330718994,
  -2.3178091049194336,
  -2.2765989303588867,
  -1.326755166053772,
  -1.3175466060638428,
  -0.8764684200286865,
  -0.8204857110977173,
  -0.6078576445579529,
  -0.14748874306678772,
  0.03384458273649216,
  1.13774573802948,
  1.2582652568817139,
  1.5518323183059692,
  1.759530782699585,
  2.0418384075164795,
  2.0421247482299805,
  2.0900585651397705,
  2.2225425243377686,
  2.5621581077575684,
  2.634566307067871,
  3.2344024181365967,
  3.5264554023742676,
  3.9798927307128906,
  4.528395175933838,
  4.980359077453613,
  5.023870468139648,
  5.101649761199951,
  5.4843430519104,
  5.499208927154541,
  5.767688751220703,
  6.055461406707764,
  6.145554065704346,
  6.502953052520752,
  7.170252799987793,
  8.151906967163086,
  8.231554985046387,
  8.923933982849121,
  9.553803443908691,
  9.586153030395508,
  9.94378662109375,
  11.134817123413086,
  14.69776439666748,
  16.117816925048828,
  17.431556701660156,
  19.300413131713867,
  19.300886154174805,
  19.808244705200195],
 [-22.067176818847656,
  -21.124095916748047,
  -18.25593376159668,
  -15.320884704589844,
  -14.183019638061523,
  -14.059952735900879,
  -13.960810661315918,
  -13.90261173248291,
  -13.34217643737793,
  -12.836686134338379,
  -11.912752151489258,
  -11.274280548095703,
  -11.244223594665527,
  -11.103535652160645,
  -9.998546600341797,
  -9.880922317504883,
  -9.348963737487793,
  -8.731964111328125,
  -8.48892593383789,
  -8.388842582702637,
  -8.017072677612305,
  -7.352850437164307,
  -7.137564659118652,
  -6.9736247062683105,
  -6.883521556854248,
  -6.530824184417725,
  -6.333107948303223,
  -6.279407024383545,
  -6.257161617279053,
  -6.230367660522461,
  -5.599913597106934,
  -5.478761196136475,
  -5.4539899826049805,
  -5.038331031799316,
  -4.73641300201416,
  -4.733596324920654,
  -4.703961372375488,
  -4.693646430969238,
  -4.651918888092041,
  -4.248964786529541,
  -4.127368450164795,
  -3.982645273208618,
  -3.8976142406463623,
  -3.7854480743408203,
  -3.69309663772583,
  -3.6248538494110107,
  -3.385435104370117,
  -3.028947353363037,
  -2.9941515922546387,
  -2.7227838039398193,
  -2.039555072784424,
  -2.0174853801727295,
  -1.6151596307754517,
  -1.438601016998291,
  -1.3593250513076782,
  -1.3225574493408203,
  -0.47511163353919983,
  -0.46689584851264954,
  -0.07336807250976562,
  -0.023420605808496475,
  0.16628508269786835,
  0.5770238637924194,
  0.7388085722923279,
  1.7237036228179932,
  1.8312305212020874,
  2.0931496620178223,
  2.2784571647644043,
  2.5303306579589844,
  2.530586004257202,
  2.573352098464966,
  2.691553831100464,
  2.9945571422576904,
  3.059159278869629,
  3.594330072402954,
  3.854898452758789,
  4.259452819824219,
  4.748823642730713,
  5.152063846588135,
  5.190884590148926,
  5.260278701782227,
  5.601716041564941,
  5.614979267120361,
  5.854515075683594,
  6.111264705657959,
  6.191644668579102,
  6.510514736175537,
  7.1058759689331055,
  7.98170280456543,
  8.052763938903809,
  8.670501708984375,
  9.232467651367188,
  9.261330604553223,
  9.580409049987793,
  10.643040657043457,
  13.821883201599121,
  15.088847160339355,
  16.26095962524414,
  17.9283447265625,
  17.92876625061035,
  18.381427764892578],
 [-19.276042938232422,
  -18.424091339111328,
  -15.833085060119629,
  -13.181654930114746,
  -12.153742790222168,
  -12.04256820678711,
  -11.953006744384766,
  -11.900431632995605,
  -11.39415168762207,
  -10.937507629394531,
  -10.102855682373047,
  -9.526080131530762,
  -9.49892807006836,
  -9.371834754943848,
  -8.373621940612793,
  -8.267363548278809,
  -7.786808967590332,
  -7.22943115234375,
  -7.009877681732178,
  -6.919466018676758,
  -6.583621025085449,
  -5.983583450317383,
  -5.7891011238098145,
  -5.641002655029297,
  -5.559606552124023,
  -5.24099063873291,
  -5.062380313873291,
  -5.01386833190918,
  -4.993772506713867,
  -4.969567775726318,
  -4.400035381317139,
  -4.290590286254883,
  -4.26821231842041,
  -3.8927195072174072,
  -3.619976043701172,
  -3.617431640625,
  -3.590660333633423,
  -3.5813422203063965,
  -3.543646812438965,
  -3.179630756378174,
  -3.069784641265869,
  -2.9390463829040527,
  -2.862231731414795,
  -2.760904550552368,
  -2.6774771213531494,
  -2.615828514099121,
  -2.399545431137085,
  -2.077505588531494,
  -2.046072244644165,
  -1.8009270429611206,
  -1.1837197542190552,
  -1.1637827157974243,
  -0.8003342151641846,
  -0.640836775302887,
  -0.5692213177680969,
  -0.5360066294670105,
  0.22954916954040527,
  0.23697106540203094,
  0.5924716591835022,
  0.637592613697052,
  0.8089667558670044,
  1.1800153255462646,
  1.3261665105819702,
  2.2158896923065186,
  2.313025951385498,
  2.549635410308838,
  2.717036485671997,
  2.944571018218994,
  2.9448018074035645,
  2.9834353923797607,
  3.0902152061462402,
  3.363938570022583,
  3.4222981929779053,
  3.905754804611206,
  4.141143798828125,
  4.506605625152588,
  4.94868803024292,
  5.312962532043457,
  5.348031520843506,
  5.410720348358154,
  5.71916389465332,
  5.73114538192749,
  5.947534561157227,
  6.179473876953125,
  6.252087116241455,
  6.540143966674805,
  7.077974796295166,
  7.869168758392334,
  7.933363437652588,
  8.491408348083496,
  8.999070167541504,
  9.02514362335205,
  9.313389778137207,
  10.273337364196777,
  13.145004272460938,
  14.289539337158203,
  15.348388671875,
  16.854652404785156,
  16.855031967163086,
  17.263954162597656],
 [-17.02360725402832,
  -16.244606018066406,
  -13.875457763671875,
  -11.451059341430664,
  -10.511163711547852,
  -10.409507751464844,
  -10.327615737915039,
  -10.279541969299316,
  -9.81661319732666,
  -9.399069786071777,
  -8.635885238647461,
  -8.10849666595459,
  -8.083669662475586,
  -7.967459201812744,
  -7.054719924926758,
  -6.957560062408447,
  -6.518153190612793,
  -6.0085015296936035,
  -5.807747840881348,
  -5.7250776290893555,
  -5.417989253997803,
  -4.869330883026123,
  -4.691501617431641,
  -4.556084156036377,
  -4.4816575050354,
  -4.190323829650879,
  -4.02700662612915,
  -3.9826488494873047,
  -3.964273452758789,
  -3.942141532897949,
  -3.4213757514953613,
  -3.3213019371032715,
  -3.3008406162261963,
  -2.9574995040893555,
  -2.7081100940704346,
  -2.7057836055755615,
  -2.681304693222046,
  -2.6727843284606934,
  -2.6383166313171387,
  -2.3054697513580322,
  -2.205029249191284,
  -2.0854856967926025,
  -2.0152485370635986,
  -1.9225974082946777,
  -1.846313714981079,
  -1.7899439334869385,
  -1.5921801328659058,
  -1.2977153062820435,
  -1.268973469734192,
  -1.0448191165924072,
  -0.48046091198921204,
  -0.4622310400009155,
  -0.12990324199199677,
  0.015937041491270065,
  0.08142035454511642,
  0.11179099977016449,
  0.8117952346801758,
  0.8185816407203674,
  1.1436420679092407,
  1.1848994493484497,
  1.3415995836257935,
  1.680876612663269,
  1.8145134449005127,
  2.6280529499053955,
  2.716871976852417,
  2.9332215785980225,
  3.0862884521484375,
  3.2943403720855713,
  3.294551134109497,
  3.3298768997192383,
  3.427513360977173,
  3.6777989864349365,
  3.731161594390869,
  4.173221588134766,
  4.388454914093018,
  4.722623825073242,
  5.126852512359619,
  5.459935665130615,
  5.492002010345459,
  5.549322605133057,
  5.831355094909668,
  5.842310905456543,
  6.0401716232299805,
  6.252251148223877,
  6.318646430969238,
  6.582037925720215,
  7.073816776275635,
  7.797264099121094,
  7.855961799621582,
  8.366223335266113,
  8.830416679382324,
  8.854257583618164,
  9.11782169342041,
  9.995573043823242,
  12.621350288391113,
  13.667882919311523,
  14.636066436767578,
  16.013355255126953,
  16.013702392578125,
  16.387609481811523],
 [-15.204924583435059,
  -14.484371185302734,
  -12.292978286743164,
  -10.050481796264648,
  -9.181105613708496,
  -9.087077140808105,
  -9.01132869720459,
  -8.966862678527832,
  -8.538666725158691,
  -8.152451515197754,
  -7.446528434753418,
  -6.958709716796875,
  -6.9357452392578125,
  -6.828253746032715,
  -5.983996868133545,
  -5.894127368927002,
  -5.487689018249512,
  -5.0162763595581055,
  -4.830584526062012,
  -4.754117012023926,
  -4.470069885253906,
  -3.9625768661499023,
  -3.7980897426605225,
  -3.672832727432251,
  -3.603990077972412,
  -3.33451509475708,
  -3.1834518909454346,
  -3.1424221992492676,
  -3.125425338745117,
  -3.1049540042877197,
  -2.623260974884033,
  -2.530695676803589,
  -2.5117695331573486,
  -2.1941893100738525,
  -1.963511347770691,
  -1.9613593816757202,
  -1.938717007637024,
  -1.9308359622955322,
  -1.8989545106887817,
  -1.591080904006958,
  -1.4981764554977417,
  -1.3876020908355713,
  -1.3226348161697388,
  -1.2369352579116821,
  -1.1663750410079956,
  -1.1142346858978271,
  -0.9313089847564697,
  -0.6589377522468567,
  -0.6323524117469788,
  -0.42501628398895264,
  0.09699846059083939,
  0.11386056244373322,
  0.4212539494037628,
  0.5561519265174866,
  0.616722047328949,
  0.6448140144348145,
  1.2922972440719604,
  1.298574447631836,
  1.5992457866668701,
  1.637407660484314,
  1.7823506593704224,
  2.0961718559265137,
  2.2197821140289307,
  2.9722821712493896,
  3.0544371604919434,
  3.254554033279419,
  3.396136522293091,
  3.588578224182129,
  3.588773250579834,
  3.621448516845703,
  3.711759328842163,
  3.9432661533355713,
  3.9926249980926514,
  4.401517391204834,
  4.600602149963379,
  4.909698486328125,
  5.283597946166992,
  5.5916900634765625,
  5.621350288391113,
  5.674370288848877,
  5.935242176055908,
  5.945375919342041,
  6.128391265869141,
  6.324558258056641,
  6.385972023010254,
  6.62960147857666,
  7.084482192993164,
  7.753649711608887,
  7.807943344116211,
  8.27992057800293,
  8.709284782409668,
  8.731337547302246,
  8.975126266479492,
  9.787020683288574,
  12.215786933898926,
  13.183798789978027,
  14.079340934753418,
  15.353291511535645,
  15.353612899780273,
  15.69946575164795],
 [-13.7357177734375,
  -13.06203556060791,
  -11.013188362121582,
  -8.916561126708984,
  -8.103736877441406,
  -8.015825271606445,
  -7.945003986358643,
  -7.903429985046387,
  -7.503087520599365,
  -7.141994953155518,
  -6.481991291046143,
  -6.025904178619385,
  -6.0044331550598145,
  -5.903934001922607,
  -5.114594459533691,
  -5.0305705070495605,
  -4.650570392608643,
  -4.209822177886963,
  -4.036209583282471,
  -3.9647161960601807,
  -3.6991453170776367,
  -3.2246639728546143,
  -3.070876359939575,
  -2.9537672996520996,
  -2.8894026279449463,
  -2.6374564170837402,
  -2.4962196350097656,
  -2.4578588008880615,
  -2.441967725753784,
  -2.422827959060669,
  -1.9724682569503784,
  -1.885924220085144,
  -1.8682290315628052,
  -1.5713067054748535,
  -1.3556339740753174,
  -1.3536220788955688,
  -1.3324525356292725,
  -1.3250840902328491,
  -1.2952765226364136,
  -1.007429599761963,
  -0.9205683469772339,
  -0.8171865940093994,
  -0.7564453482627869,
  -0.6763203740119934,
  -0.6103500127792358,
  -0.5616012215614319,
  -0.39057457447052,
  -0.13592055439949036,
  -0.11106456071138382,
  0.0827847421169281,
  0.5708433985710144,
  0.5866086483001709,
  0.8740066289901733,
  1.0001296997070312,
  1.0567599534988403,
  1.083024501800537,
  1.6883901357650757,
  1.6942590475082397,
  1.975372314453125,
  2.011051893234253,
  2.146566390991211,
  2.439974308013916,
  2.5555436611175537,
  3.2590951919555664,
  3.3359060287475586,
  3.523005723953247,
  3.655378580093384,
  3.8353021144866943,
  3.835484743118286,
  3.8660342693328857,
  3.9504706859588623,
  4.1669182777404785,
  4.213066577911377,
  4.595361232757568,
  4.781496047973633,
  5.070486068725586,
  5.4200639724731445,
  5.708115100860596,
  5.735846042633057,
  5.785417556762695,
  6.029320240020752,
  6.03879451751709,
  6.20990514755249,
  6.393311977386475,
  6.450730800628662,
  6.6785125732421875,
  7.103804111480713,
  7.729443550109863,
  7.780205726623535,
  8.221481323242188,
  8.622916221618652,
  8.643534660339355,
  8.871465682983398,
  9.630547523498535,
  11.901327133178711,
  12.806371688842773,
  13.643659591674805,
  14.834742546081543,
  14.835042953491211,
  15.158398628234863],
 [-12.548260688781738,
  -11.912196159362793,
  -9.97775650024414,
  -7.998204708099365,
  -7.230768203735352,
  -7.147764682769775,
  -7.080898761749268,
  -7.0416460037231445,
  -6.663658618927002,
  -6.322729110717773,
  -5.69957971572876,
  -5.268960475921631,
  -5.248688697814941,
  -5.153800964355469,
  -4.408538341522217,
  -4.3292059898376465,
  -3.9704248905181885,
  -3.554287910461426,
  -3.3903696537017822,
  -3.322868585586548,
  -3.072127103805542,
  -2.624140739440918,
  -2.478940725326538,
  -2.368370771408081,
  -2.307600259780884,
  -2.0697226524353027,
  -1.9363723993301392,
  -1.900153636932373,
  -1.8851499557495117,
  -1.8670789003372192,
  -1.4418671131134033,
  -1.360155701637268,
  -1.3434486389160156,
  -1.0631064176559448,
  -0.8594767451286316,
  -0.8575771450996399,
  -0.8375897407531738,
  -0.830632746219635,
  -0.8024895787239075,
  -0.5307159423828125,
  -0.4487050175666809,
  -0.35109609365463257,
  -0.29374656081199646,
  -0.2180957943201065,
  -0.1558091938495636,
  -0.10978250950574875,
  0.051694076508283615,
  0.2921282947063446,
  0.315596342086792,
  0.4986211657524109,
  0.959426760673523,
  0.9743117094039917,
  1.2456614971160889,
  1.3647419214248657,
  1.4182099103927612,
  1.4430078268051147,
  2.0145699977874756,
  2.020111322402954,
  2.285527229309082,
  2.319214344024658,
  2.447161912918091,
  2.7241859436035156,
  2.8333020210266113,
  3.4975674152374268,
  3.570089101791382,
  3.74674129486084,
  3.871722459793091,
  4.041599273681641,
  4.041771411895752,
  4.070615291595459,
  4.150336742401123,
  4.354698181152344,
  4.398269176483154,
  4.759216785430908,
  4.934957981109619,
  5.207810878753662,
  5.537868499755859,
  5.809834957122803,
  5.836017608642578,
  5.8828206062316895,
  6.113103866577148,
  6.122049331665039,
  6.283605098724365,
  6.456770420074463,
  6.510982990264893,
  6.726045608520508,
  7.127589225769043,
  7.718293190002441,
  7.766220569610596,
  8.182855606079102,
  8.561875343322754,
  8.581341743469238,
  8.796545028686523,
  9.513239860534668,
  11.657219886779785,
  12.511727333068848,
  13.302261352539062,
  14.426834106445312,
  14.427118301391602,
  14.732418060302734],
 [-11.588088035583496,
  -10.982240676879883,
  -9.139697074890137,
  -7.254184246063232,
  -6.523205280303955,
  -6.444145202636719,
  -6.380455493927002,
  -6.343067646026611,
  -5.983036518096924,
  -5.658303260803223,
  -5.064756870269775,
  -4.6545939445495605,
  -4.635285377502441,
  -4.544905662536621,
  -3.8350467681884766,
  -3.7594833374023438,
  -3.417746067047119,
  -3.0213780403137207,
  -2.8652467727661133,
  -2.800952196121216,
  -2.5621225833892822,
  -2.1354176998138428,
  -1.9971154928207397,
  -1.8917983770370483,
  -1.8339147567749023,
  -1.6073375940322876,
  -1.480322241783142,
  -1.445824146270752,
  -1.4315330982208252,
  -1.4143205881118774,
  -1.0093086957931519,
  -0.9314789175987244,
  -0.9155654907226562,
  -0.6485410928726196,
  -0.4545849859714508,
  -0.45277559757232666,
  -0.43373769521713257,
  -0.4271112382411957,
  -0.40030497312545776,
  -0.14144207537174225,
  -0.0633271187543869,
  0.02964484691619873,
  0.0842699483036995,
  0.15632690489292145,
  0.21565455198287964,
  0.25949472188949585,
  0.4133002758026123,
  0.6423125863075256,
  0.6646657586097717,
  0.8389959335327148,
  1.2779107093811035,
  1.292088508605957,
  1.55054771900177,
  1.663971185684204,
  1.7148991823196411,
  1.7385190725326538,
  2.282928943634033,
  2.2882070541381836,
  2.5410141944885254,
  2.573101043701172,
  2.6949703693389893,
  2.958834171295166,
  3.0627667903900146,
  3.6954758167266846,
  3.764552593231201,
  3.9328126907348633,
  4.051856517791748,
  4.213663101196289,
  4.213827133178711,
  4.2413010597229,
  4.317235469818115,
  4.51188850402832,
  4.553389549255371,
  4.897190093994141,
  5.064582347869873,
  5.3244733810424805,
  5.638851642608643,
  5.897898197174072,
  5.922836780548096,
  5.967416763305664,
  6.186760425567627,
  6.1952805519104,
  6.349161624908447,
  6.514101028442383,
  6.565738201141357,
  6.7705841064453125,
  7.153051853179932,
  7.715693950653076,
  7.761344909667969,
  8.158186912536621,
  8.519201278686523,
  8.537742614746094,
  8.74272346496582,
  9.425371170043945,
  11.467500686645508,
  12.281414031982422,
  13.034393310546875,
  14.10554313659668,
  14.105813980102539,
  14.396610260009766],
 [-10.811363220214844,
  -10.229805946350098,
  -8.46113395690918,
  -6.651216983795166,
  -5.949544429779053,
  -5.873653888702393,
  -5.8125176429748535,
  -5.776628494262695,
  -5.431032180786133,
  -5.11931848526001,
  -4.5495686531066895,
  -4.155850410461426,
  -4.13731575012207,
  -4.0505595207214355,
  -3.3691604137420654,
  -3.296626567840576,
  -2.968590497970581,
  -2.58811354637146,
  -2.438242197036743,
  -2.376525402069092,
  -2.147270917892456,
  -1.7376737594604492,
  -1.6049163341522217,
  -1.5038214921951294,
  -1.448258638381958,
  -1.2307655811309814,
  -1.1088424921035767,
  -1.0757274627685547,
  -1.0620094537734985,
  -1.0454870462417603,
  -0.6567130088806152,
  -0.582003653049469,
  -0.5667282342910767,
  -0.31040942668914795,
  -0.12422949820756912,
  -0.12249265611171722,
  -0.104218028485775,
  -0.09785724431276321,
  -0.07212571799755096,
  0.17635875940322876,
  0.25134190917015076,
  0.340586394071579,
  0.39302143454551697,
  0.4621894657611847,
  0.519138514995575,
  0.5612210631370544,
  0.7088601589202881,
  0.9286907911300659,
  0.950147807598114,
  1.1174886226654053,
  1.5388063192367554,
  1.5524157285690308,
  1.800512671470642,
  1.909388780593872,
  1.9582748413085938,
  1.9809478521347046,
  2.503530979156494,
  2.5085973739624023,
  2.7512691020965576,
  2.782069444656372,
  2.899052858352661,
  3.1523375511169434,
  3.252103328704834,
  3.859445571899414,
  3.925752639770508,
  4.08726692199707,
  4.2015380859375,
  4.356857776641846,
  4.357015132904053,
  4.383387088775635,
  4.456276893615723,
  4.643126010894775,
  4.6829633712768555,
  5.012979984283447,
  5.173661231994629,
  5.423132419586182,
  5.7249064445495605,
  5.973567485809326,
  5.997506141662598,
  6.040298938751221,
  6.250848293304443,
  6.259027004241943,
  6.406738758087158,
  6.565064907073975,
  6.6146321296691895,
  6.811265468597412,
  7.178399085998535,
  7.7184834480285645,
  7.762304306030273,
  8.14323616027832,
  8.489776611328125,
  8.507574081420898,
  8.704336166381836,
  9.359615325927734,
  11.319870948791504,
  12.101153373718262,
  12.823944091796875,
  13.852148056030273,
  13.852408409118652,
  14.131546020507812],
 [-10.182785987854004,
  -9.620768547058105,
  -7.911523342132568,
  -6.162417888641357,
  -5.484321117401123,
  -5.410980701446533,
  -5.351898670196533,
  -5.317215442657471,
  -4.9832305908203125,
  -4.681990146636963,
  -4.131383895874023,
  -3.750894069671631,
  -3.7329823970794678,
  -3.6491410732269287,
  -2.9906365871429443,
  -2.9205398559570312,
  -2.6035256385803223,
  -2.235832691192627,
  -2.090996742248535,
  -2.03135347366333,
  -1.8098018169403076,
  -1.4139670133590698,
  -1.2856701612472534,
  -1.187972068786621,
  -1.1342761516571045,
  -0.9240906238555908,
  -0.8062641024589539,
  -0.7742617130279541,
  -0.761004626750946,
  -0.745037317276001,
  -0.3693259060382843,
  -0.29712674021720886,
  -0.2823645770549774,
  -0.03465794026851654,
  0.14526645839214325,
  0.14694494009017944,
  0.1646055430173874,
  0.170752614736557,
  0.19561956822872162,
  0.4357551038265228,
  0.5082188844680786,
  0.5944647789001465,
  0.6451380848884583,
  0.7119820713996887,
  0.767017662525177,
  0.8076862692832947,
  0.9503647685050964,
  1.1628092527389526,
  1.1835453510284424,
  1.3452636003494263,
  1.752425193786621,
  1.7655773162841797,
  2.005338430404663,
  2.1105563640594482,
  2.15779972076416,
  2.179711103439331,
  2.6847357749938965,
  2.689631938934326,
  2.924149751663208,
  2.9539153575897217,
  3.0669682025909424,
  3.3117427825927734,
  3.408156394958496,
  3.9950923919677734,
  4.059171676635742,
  4.215259075164795,
  4.325690746307373,
  4.4757914543151855,
  4.475943565368652,
  4.501429557800293,
  4.571870803833008,
  4.75244140625,
  4.790940284729004,
  5.109869003295898,
  5.265151023864746,
  5.506240367889404,
  5.797874927520752,
  6.038180828094482,
  6.061315536499023,
  6.102670192718506,
  6.306145191192627,
  6.314049243927002,
  6.456798076629639,
  6.609804630279541,
  6.657706260681152,
  6.8477325439453125,
  7.202530860900879,
  7.72446870803833,
  7.766817092895508,
  8.134949684143066,
  8.469846725463867,
  8.48704719543457,
  8.677197456359863,
  9.310460090637207,
  11.204852104187012,
  11.959882736206055,
  12.658388137817383,
  13.652046203613281,
  13.652297019958496,
  13.9220552444458],
 [-9.673905372619629,
  -9.127617835998535,
  -7.466211318969727,
  -5.766060829162598,
  -5.106943130493164,
  -5.0356550216674805,
  -4.978226661682129,
  -4.944514274597168,
  -4.619877338409424,
  -4.327067852020264,
  -3.791872262954712,
  -3.422031879425049,
  -3.4046216011047363,
  -3.323126792907715,
  -2.6830527782440186,
  -2.6149179935455322,
  -2.306776523590088,
  -1.9493745565414429,
  -1.808592438697815,
  -1.750618577003479,
  -1.5352678298950195,
  -1.1505117416381836,
  -1.0258057117462158,
  -0.9308421015739441,
  -0.8786489963531494,
  -0.6743462681770325,
  -0.5598175525665283,
  -0.5287108421325684,
  -0.5158247947692871,
  -0.5003044009208679,
  -0.13510854542255402,
  -0.06493011862039566,
  -0.050581131130456924,
  0.1901925802230835,
  0.36508116126060486,
  0.36671265959739685,
  0.3838789761066437,
  0.3898540139198303,
  0.4140249788761139,
  0.6474394798278809,
  0.7178751230239868,
  0.8017071485519409,
  0.8509621620178223,
  0.9159352779388428,
  0.9694305658340454,
  1.0089608430862427,
  1.1476460695266724,
  1.35414457321167,
  1.374300241470337,
  1.5314922332763672,
  1.927258014678955,
  1.9400420188903809,
  2.1730926036834717,
  2.2753655910491943,
  2.321286916732788,
  2.3425848484039307,
  2.833474636077881,
  2.838233709335327,
  3.066187858581543,
  3.095120429992676,
  3.2050089836120605,
  3.4429328441619873,
  3.5366477966308594,
  4.107156276702881,
  4.169442176818848,
  4.321160793304443,
  4.428501605987549,
  4.574401378631592,
  4.574549674987793,
  4.599322319030762,
  4.667791366577148,
  4.843308448791504,
  4.880730152130127,
  5.190732002258301,
  5.341668128967285,
  5.576009750366211,
  5.8594818115234375,
  6.093061923980713,
  6.115549087524414,
  6.1557464599609375,
  6.353526592254639,
  6.361209392547607,
  6.49996280670166,
  6.64868688583374,
  6.695247650146484,
  6.879955768585205,
  7.224823474884033,
  7.732153415679932,
  7.773316383361816,
  8.131145477294922,
  8.456668853759766,
  8.473387718200684,
  8.65821647644043,
  9.273755073547363,
  11.11512565612793,
  11.849024772644043,
  12.527979850769043,
  13.493826866149902,
  13.494071006774902,
  13.756278991699219],
 [-9.261781692504883,
  -8.728165626525879,
  -7.105295658111572,
  -5.444580554962158,
  -4.800751209259033,
  -4.731117248535156,
  -4.675020694732666,
  -4.642090320587158,
  -4.3249831199646,
  -4.038965702056885,
  -3.516183853149414,
  -3.1549222469329834,
  -3.13791561126709,
  -3.0583112239837646,
  -2.433084011077881,
  -2.3665294647216797,
  -2.065535306930542,
  -1.716423511505127,
  -1.578906774520874,
  -1.5222777128219604,
  -1.3119219541549683,
  -0.9360904097557068,
  -0.8142769932746887,
  -0.7215160727500916,
  -0.6705335974693298,
  -0.4709697663784027,
  -0.35909754037857056,
  -0.3287123739719391,
  -0.3161252439022064,
  -0.3009648025035858,
  0.0557602196931839,
  0.12431085109710693,
  0.1383270025253296,
  0.37351590394973755,
  0.5443479418754578,
  0.5459415912628174,
  0.5627096891403198,
  0.5685461759567261,
  0.5921564698219299,
  0.8201568722724915,
  0.8889586925506592,
  0.9708462357521057,
  1.0189588069915771,
  1.0824248790740967,
  1.1346791982650757,
  1.173292636871338,
  1.3087610006332397,
  1.510469675064087,
  1.5301578044891357,
  1.6837037801742554,
  2.0702898502349854,
  2.082777261734009,
  2.31042218208313,
  2.410322904586792,
  2.45517897605896,
  2.475982904434204,
  2.955486536026001,
  2.960134983062744,
  3.1828017234802246,
  3.2110631465911865,
  3.3184027671813965,
  3.5508079528808594,
  3.6423492431640625,
  4.199624538421631,
  4.260465621948242,
  4.408665657043457,
  4.513516426086426,
  4.656032085418701,
  4.656176567077637,
  4.680374622344971,
  4.747255802154541,
  4.918701648712158,
  4.955255031585693,
  5.258066654205322,
  5.405501842498779,
  5.6344075202941895,
  5.911304473876953,
  6.139466762542725,
  6.161432266235352,
  6.200697422027588,
  6.393889904022217,
  6.401394367218018,
  6.536929130554199,
  6.682203769683838,
  6.727684497833252,
  6.908108234405518,
  7.244976997375488,
  7.740539073944092,
  7.780747413635254,
  8.130276679992676,
  8.448249816894531,
  8.464580535888672,
  8.645122528076172,
  9.246382713317871,
  11.045042991638184,
  11.761919021606445,
  12.425125122070312,
  13.368569374084473,
  13.368807792663574,
  13.624934196472168],
 [-8.927906036376953,
  -8.404502868652344,
  -6.81269645690918,
  -5.1837687492370605,
  -4.552262783050537,
  -4.483961582183838,
  -4.428938865661621,
  -4.3966383934021,
  -4.085601329803467,
  -3.805058479309082,
  -3.292283058166504,
  -2.9379360675811768,
  -2.921255111694336,
  -2.8431742191314697,
  -2.229914426803589,
  -2.1646337509155273,
  -1.869400978088379,
  -1.5269713401794434,
  -1.3920868635177612,
  -1.3365416526794434,
  -1.1302123069763184,
  -0.7615744471549988,
  -0.6420926451683044,
  -0.5511072278022766,
  -0.5011005997657776,
  -0.30535656213760376,
  -0.1956256479024887,
  -0.1658220887184143,
  -0.15347588062286377,
  -0.13860562443733215,
  0.21129140257835388,
  0.27852991223335266,
  0.2922777831554413,
  0.5229650139808655,
  0.6905271410942078,
  0.6920903325080872,
  0.7085375189781189,
  0.7142622470855713,
  0.7374206185340881,
  0.9610569477081299,
  1.0285418033599854,
  1.108862042427063,
  1.1560535430908203,
  1.2183048725128174,
  1.2695591449737549,
  1.3074333667755127,
  1.4403088092803955,
  1.6381566524505615,
  1.6574679613113403,
  1.8080748319625854,
  2.1872613430023193,
  2.199509859085083,
  2.422797203063965,
  2.5207858085632324,
  2.5647833347320557,
  2.5851891040802,
  3.0555145740509033,
  3.0600743293762207,
  3.2784790992736816,
  3.306199550628662,
  3.411484479904175,
  3.6394412517547607,
  3.7292304039001465,
  4.275839328765869,
  4.335515975952148,
  4.480878829956055,
  4.583723068237305,
  4.7235107421875,
  4.723652362823486,
  4.747387409210205,
  4.81298828125,
  4.981152534484863,
  5.0170063972473145,
  5.314021587371826,
  5.458634853363037,
  5.683159351348877,
  5.954756259918213,
  6.178551197052002,
  6.200096130371094,
  6.238609790802002,
  6.428104400634766,
  6.435465335845947,
  6.568406105041504,
  6.710899829864502,
  6.755510330200195,
  6.932480335235596,
  7.262901306152344,
  7.7489776611328125,
  7.788416385650635,
  8.131255149841309,
  8.44314193725586,
  8.459160804748535,
  8.636246681213379,
  9.225998878479004,
  10.990230560302734,
  11.693385124206543,
  12.343897819519043,
  13.269283294677734,
  13.269516944885254,
  13.520740509033203],
 [-8.657336235046387,
  -8.142171859741211,
  -6.575418949127197,
  -4.972128868103027,
  -4.35056209564209,
  -4.2833356857299805,
  -4.2291789054870605,
  -4.197387218475342,
  -3.8912453651428223,
  -3.6151180267333984,
  -3.110413074493408,
  -2.761643409729004,
  -2.745224714279175,
  -2.668372869491577,
  -2.064765214920044,
  -2.000511884689331,
  -1.709925889968872,
  -1.372885823249817,
  -1.240124225616455,
  -1.1854532957077026,
  -0.9823713898658752,
  -0.6195355653762817,
  -0.5019342303276062,
  -0.4123808741569519,
  -0.3631612956523895,
  -0.1704980731010437,
  -0.06249423325061798,
  -0.033159755170345306,
  -0.021007858216762543,
  -0.006371652241796255,
  0.3380183279514313,
  0.4041985869407654,
  0.41773006319999695,
  0.6447864770889282,
  0.8097113966941833,
  0.8112499117851257,
  0.827438235282898,
  0.83307284116745,
  0.8558667898178101,
  1.0759832859039307,
  1.1424059867858887,
  1.2214620113372803,
  1.2679108381271362,
  1.3291823863983154,
  1.3796298503875732,
  1.4169081449508667,
  1.5476921796798706,
  1.7424260377883911,
  1.7614333629608154,
  1.9096699953079224,
  2.282888412475586,
  2.2949440479278564,
  2.5147171020507812,
  2.61116361618042,
  2.654468536376953,
  2.674553155899048,
  3.1374762058258057,
  3.1419641971588135,
  3.356931447982788,
  3.3842155933380127,
  3.4878435134887695,
  3.712212324142456,
  3.800588369369507,
  4.33859395980835,
  4.397331237792969,
  4.540406227111816,
  4.641631603240967,
  4.779219627380371,
  4.779358863830566,
  4.802720546722412,
  4.867288589477539,
  5.032806396484375,
  5.068095684051514,
  5.36043643951416,
  5.502773761749268,
  5.723764419555664,
  5.991086483001709,
  6.211359024047852,
  6.232564926147461,
  6.270472049713135,
  6.456984519958496,
  6.464229583740234,
  6.595077991485596,
  6.7353291511535645,
  6.779237270355225,
  6.9534220695495605,
  7.278642177581787,
  7.757068634033203,
  7.795886516571045,
  8.133329391479492,
  8.4403076171875,
  8.456073760986328,
  8.630373001098633,
  9.21084213256836,
  10.947306632995605,
  11.639394760131836,
  12.279668807983398,
  13.190489768981934,
  13.190719604492188,
  13.437989234924316],
 [-8.438004493713379,
  -7.929488182067871,
  -6.38295316696167,
  -4.800353050231934,
  -4.186807155609131,
  -4.120448589324951,
  -4.066990852355957,
  -4.035609245300293,
  -3.7334179878234863,
  -3.4608538150787354,
  -2.9626619815826416,
  -2.6183929443359375,
  -2.602186441421509,
  -2.5263261795043945,
  -1.930507779121399,
  -1.8670837879180908,
  -1.5802475214004517,
  -1.2475568056106567,
  -1.1165084838867188,
  -1.0625430345535278,
  -0.8620818257331848,
  -0.5039282441139221,
  -0.3878445327281952,
  -0.29944679141044617,
  -0.25086236000061035,
  -0.06068538501858711,
  0.04592471569776535,
  0.07488065212965012,
  0.08687572926282883,
  0.10132306069135666,
  0.44126883149147034,
  0.5065950751304626,
  0.5199519395828247,
  0.7440782785415649,
  0.9068748950958252,
  0.9083935618400574,
  0.9243730306625366,
  0.9299349188804626,
  0.9524346590042114,
  1.169710636138916,
  1.235276222229004,
  1.31331205368042,
  1.3591614961624146,
  1.4196423292160034,
  1.469438910484314,
  1.506235957145691,
  1.6353323459625244,
  1.8275532722473145,
  1.8463153839111328,
  1.9926389455795288,
  2.3610410690307617,
  2.372941255569458,
  2.5898783206939697,
  2.685080051422119,
  2.7278263568878174,
  2.7476518154144287,
  3.2046008110046387,
  3.209030866622925,
  3.4212241172790527,
  3.4481561183929443,
  3.5504469871520996,
  3.7719204425811768,
  3.8591558933258057,
  4.390218734741211,
  4.448198318481445,
  4.5894269943237305,
  4.6893463134765625,
  4.82515811920166,
  4.825295925140381,
  4.848355770111084,
  4.912091255187988,
  5.075472831726074,
  5.110306739807129,
  5.398874759674072,
  5.539375305175781,
  5.757513999938965,
  6.021386623382568,
  6.238816738128662,
  6.259748935699463,
  6.29716682434082,
  6.4812726974487305,
  6.488424301147461,
  6.617583751678467,
  6.756025314331055,
  6.799366474151611,
  6.971303462982178,
  7.292326927185059,
  7.764579772949219,
  7.802896499633789,
  8.135985374450684,
  8.439001083374023,
  8.454564094543457,
  8.62661361694336,
  9.199593544006348,
  10.913649559020996,
  11.596805572509766,
  12.2288179397583,
  13.127883911132812,
  13.128111839294434,
  13.372190475463867],
 [-8.260159492492676,
  -7.757010459899902,
  -6.226800441741943,
  -4.660905838012695,
  -4.053836822509766,
  -3.988178253173828,
  -3.9352846145629883,
  -3.9042344093322754,
  -3.6052331924438477,
  -3.3355460166931152,
  -2.8426129817962646,
  -2.5019781589508057,
  -2.4859423637390137,
  -2.4108831882476807,
  -1.8213540315628052,
  -1.7585995197296143,
  -1.4747910499572754,
  -1.145612120628357,
  -1.0159471035003662,
  -0.9625513553619385,
  -0.7642061114311218,
  -0.4098331332206726,
  -0.29497477412223816,
  -0.20751014351844788,
  -0.1594385802745819,
  0.028730938211083412,
  0.13421568274497986,
  0.16286596655845642,
  0.174734428524971,
  0.189029261469841,
  0.5253866314888,
  0.5900232791900635,
  0.6032391786575317,
  0.8249996900558472,
  0.9860778450965881,
  0.9875805377960205,
  1.0033912658691406,
  1.008894443511963,
  1.0311566591262817,
  1.2461391687393188,
  1.3110127449035645,
  1.388224720954895,
  1.4335901737213135,
  1.493432641029358,
  1.5427035093307495,
  1.5791122913360596,
  1.7068458795547485,
  1.8970377445220947,
  1.9156018495559692,
  2.0603809356689453,
  2.424894332885742,
  2.436668634414673,
  2.651315927505493,
  2.7455127239227295,
  2.7878077030181885,
  2.8074238300323486,
  3.259549617767334,
  3.263932704925537,
  3.473886013031006,
  3.5005338191986084,
  3.6017448902130127,
  3.820880651473999,
  3.9071953296661377,
  4.432652473449707,
  4.490019798278809,
  4.629757404327393,
  4.728621959686279,
  4.863000392913818,
  4.8631367683410645,
  4.885953426361084,
  4.9490156173706055,
  5.110672950744629,
  5.145139217376709,
  5.430661201477051,
  5.56967830657959,
  5.785514831542969,
  6.04660177230835,
  6.261736869812012,
  6.2824482917785645,
  6.31947135925293,
  6.501633167266846,
  6.50870943069458,
  6.636505603790283,
  6.7734856605529785,
  6.816370010375977,
  6.986491680145264,
  7.304126739501953,
  7.7713942527771,
  7.809306621551514,
  8.13887882232666,
  8.43869686126709,
  8.454095840454102,
  8.62432861328125,
  9.19126033782959,
  10.887223243713379,
  11.5631685256958,
  12.188508033752441,
  13.078084945678711,
  13.078310012817383,
  13.319812774658203],
 [-8.115914344787598,
  -7.617101669311523,
  -6.1000800132751465,
  -4.547680854797363,
  -3.9458436965942383,
  -3.880751132965088,
  -3.8283135890960693,
  -3.7975308895111084,
  -3.5011065006256104,
  -3.233743667602539,
  -2.745059013366699,
  -2.4073598384857178,
  -2.3914623260498047,
  -2.317049980163574,
  -1.7326017618179321,
  -1.670388102531433,
  -1.3890256881713867,
  -1.0626837015151978,
  -0.9341362714767456,
  -0.8812006711959839,
  -0.6845648884773254,
  -0.3332460820674896,
  -0.21937762200832367,
  -0.13266681134700775,
  -0.08500954508781433,
  0.10153822600841522,
  0.20611386001110077,
  0.23451721668243408,
  0.2462833821773529,
  0.26045501232147217,
  0.5939134955406189,
  0.6579930782318115,
  0.671095073223114,
  0.8909443616867065,
  1.0506342649459839,
  1.0521239042282104,
  1.067798376083374,
  1.0732542276382446,
  1.0953246355056763,
  1.3084542751312256,
  1.3727686405181885,
  1.4493151903152466,
  1.494289755821228,
  1.5536164045333862,
  1.602462649345398,
  1.6385575532913208,
  1.7651903629302979,
  1.9537429809570312,
  1.9721471071243286,
  2.115678310394287,
  2.4770500659942627,
  2.4887232780456543,
  2.7015204429626465,
  2.794905424118042,
  2.8368358612060547,
  2.856282949447632,
  3.3045120239257812,
  3.3088574409484863,
  3.5170013904571533,
  3.543419361114502,
  3.6437580585479736,
  3.8610050678253174,
  3.946575880050659,
  4.467504501342773,
  4.524377346038818,
  4.6629109382629395,
  4.760923385620117,
  4.894143581390381,
  4.894278526306152,
  4.916898727416992,
  4.97941780090332,
  5.139681339263916,
  5.1738505363464355,
  5.456912040710449,
  5.594730854034424,
  5.808707237243652,
  6.067543983459473,
  6.280825138092041,
  6.301357746124268,
  6.338061809539795,
  6.518653869628906,
  6.525669097900391,
  6.6523637771606445,
  6.788163185119629,
  6.830677509307861,
  6.999333381652832,
  7.314230918884277,
  7.77747106552124,
  7.815056800842285,
  8.141789436340332,
  8.4390230178833,
  8.454288482666016,
  8.623055458068848,
  9.185099601745605,
  10.866446495056152,
  11.536565780639648,
  12.156517028808594,
  13.038426399230957,
  13.038649559020996,
  13.278070449829102],
 [-7.998893737792969,
  -7.5035858154296875,
  -5.997223377227783,
  -4.4557318687438965,
  -3.858123540878296,
  -3.7934882640838623,
  -3.7414190769195557,
  -3.71085262298584,
  -3.416511058807373,
  -3.151026964187622,
  -2.665776014328003,
  -2.3304495811462402,
  -2.314663887023926,
  -2.240774154663086,
  -1.6604324579238892,
  -1.5986559391021729,
  -1.319270372390747,
  -0.9952215552330017,
  -0.8675772547721863,
  -0.815013587474823,
  -0.6197594404220581,
  -0.2709091007709503,
  -0.15784072875976562,
  -0.07173916697502136,
  -0.024416757747530937,
  0.16082027554512024,
  0.26466113328933716,
  0.29286491870880127,
  0.3045484125614166,
  0.3186204731464386,
  0.6497359871864319,
  0.7133653163909912,
  0.7263752222061157,
  0.9446797966957092,
  1.1032476425170898,
  1.1047269105911255,
  1.1202912330627441,
  1.1257086992263794,
  1.1476240158081055,
  1.3592561483383179,
  1.4231185913085938,
  1.4991273880004883,
  1.5437859296798706,
  1.6026957035064697,
  1.6511987447738647,
  1.687040090560913,
  1.8127830028533936,
  2.0000109672546387,
  2.0182857513427734,
  2.1608083248138428,
  2.519641160964966,
  2.5312321186065674,
  2.7425341606140137,
  2.8352630138397217,
  2.876898765563965,
  2.896209239959717,
  3.3412890434265137,
  3.3456039428710938,
  3.5522851943969727,
  3.5785176753997803,
  3.6781513690948486,
  3.893872022628784,
  3.978841543197632,
  4.496109962463379,
  4.55258321762085,
  4.69014310836792,
  4.787467002868652,
  4.9197516441345215,
  4.919885635375977,
  4.942346572875977,
  5.004426002502441,
  5.1635637283325195,
  5.197493076324463,
  5.478565692901611,
  5.615416049957275,
  5.8278889656066895,
  6.084907054901123,
  6.296689510345459,
  6.317078113555908,
  6.353524208068848,
  6.5328474044799805,
  6.539813041687012,
  6.665617942810059,
  6.8004631996154785,
  6.842678546905518,
  7.0101494789123535,
  7.322834491729736,
  7.782819747924805,
  7.820141315460205,
  8.144577980041504,
  8.439723014831543,
  8.45488166809082,
  8.622462272644043,
  9.180558204650879,
  10.850090980529785,
  11.515501976013184,
  12.131096839904785,
  13.00680923461914,
  13.007031440734863,
  13.244770050048828],
 [-7.903938293457031,
  -7.411464214324951,
  -5.913720607757568,
  -4.381049156188965,
  -3.7868597507476807,
  -3.7225944995880127,
  -3.670823335647583,
  -3.6404316425323486,
  -3.3477742671966553,
  -3.0838091373443604,
  -2.601334571838379,
  -2.2679266929626465,
  -2.2522313594818115,
  -2.178764581680298,
  -1.601743221282959,
  -1.5403201580047607,
  -1.262533187866211,
  -0.9403384327888489,
  -0.8134244680404663,
  -0.7611615657806396,
  -0.5670245885848999,
  -0.22017022967338562,
  -0.10774879902601242,
  -0.022139888256788254,
  0.02491176314651966,
  0.20908893644809723,
  0.31233564019203186,
  0.3403780460357666,
  0.35199472308158875,
  0.36598625779151917,
  0.6952072381973267,
  0.7584725022315979,
  0.771407961845398,
  0.9884634613990784,
  1.1461241245269775,
  1.1475948095321655,
  1.1630702018737793,
  1.1684565544128418,
  1.1902464628219604,
  1.4006677865982056,
  1.4641648530960083,
  1.5397387742996216,
  1.584141731262207,
  1.642714500427246,
  1.690940022468567,
  1.7265762090682983,
  1.8515998125076294,
  2.0377564430236816,
  2.055926561355591,
  2.197633981704712,
  2.5544135570526123,
  2.5659382343292236,
  2.776031255722046,
  2.868229389190674,
  2.9096271991729736,
  2.9288270473480225,
  3.3713600635528564,
  3.375650405883789,
  3.581149101257324,
  3.607231616973877,
  3.7062952518463135,
  3.9207816123962402,
  4.005264759063721,
  4.51957368850708,
  4.575723648071289,
  4.712496757507324,
  4.809263706207275,
  4.940791130065918,
  4.940924644470215,
  4.9632568359375,
  5.024981498718262,
  5.183208465576172,
  5.216943740844727,
  5.496407985687256,
  5.632475852966309,
  5.8437323570251465,
  6.09928035736084,
  6.309850692749023,
  6.330122947692871,
  6.366360187530518,
  6.544657230377197,
  6.551583290100098,
  6.676668167114258,
  6.810741901397705,
  6.852716445922852,
  7.019228935241699,
  7.330124378204346,
  7.787477970123291,
  7.824585914611816,
  8.14716625213623,
  8.44062328338623,
  8.455695152282715,
  8.622316360473633,
  9.17721939086914,
  10.837199211120605,
  11.49880313873291,
  12.110876083374023,
  12.98157787322998,
  12.98179817199707,
  13.21817684173584],
 [-7.826869964599609,
  -7.336688995361328,
  -5.845917224884033,
  -4.320380687713623,
  -3.728957414627075,
  -3.6649913787841797,
  -3.6134610176086426,
  -3.5832109451293945,
  -3.2919158935546875,
  -3.029179573059082,
  -2.5489509105682373,
  -2.217095136642456,
  -2.201472759246826,
  -2.1283481121063232,
  -1.5540128946304321,
  -1.4928756952285767,
  -1.2163819074630737,
  -0.8956869840621948,
  -0.7693638205528259,
  -0.7173442244529724,
  -0.5241109728813171,
  -0.1788712739944458,
  -0.06697317957878113,
  0.01823720894753933,
  0.06506982445716858,
  0.24838963150978088,
  0.35115569829940796,
  0.3790675699710846,
  0.39063015580177307,
  0.4045565724372864,
  0.7322449684143066,
  0.7952157258987427,
  0.8080909848213196,
  1.0241360664367676,
  1.1810626983642578,
  1.182526707649231,
  1.1979299783706665,
  1.2032912969589233,
  1.2249797582626343,
  1.434421420097351,
  1.4976229667663574,
  1.5728451013565063,
  1.6170413494110107,
  1.6753414869308472,
  1.7233424186706543,
  1.7588127851486206,
  1.8832542896270752,
  2.068544387817383,
  2.08663010597229,
  2.227677583694458,
  2.582796335220337,
  2.5942673683166504,
  2.803382396697998,
  2.8951516151428223,
  2.936356544494629,
  2.9554669857025146,
  3.395940065383911,
  3.400210380554199,
  3.604752540588379,
  3.63071346282959,
  3.729315996170044,
  3.9428038597106934,
  4.0268940925598145,
  4.538808345794678,
  4.594696998596191,
  4.730833530426025,
  4.827149868011475,
  4.958065032958984,
  4.958198070526123,
  4.98042631149292,
  5.041863441467285,
  5.19935417175293,
  5.232932090759277,
  5.5110955238342285,
  5.646529674530029,
  5.8568034172058105,
  6.111161231994629,
  6.320751667022705,
  6.34092903137207,
  6.376997947692871,
  6.554465293884277,
  6.56135892868042,
  6.685861587524414,
  6.819311141967773,
  6.861090183258057,
  7.026827335357666,
  7.336275577545166,
  7.791500091552734,
  7.82843542098999,
  8.149514198303223,
  8.441604614257812,
  8.4566068649292,
  8.622452735900879,
  9.174772262573242,
  10.827024459838867,
  11.485548973083496,
  12.094772338867188,
  12.961421012878418,
  12.961640357971191,
  13.196918487548828],
 [-7.764307975769043,
  -7.27598237991333,
  -5.790853023529053,
  -4.271090030670166,
  -3.681905508041382,
  -3.6181814670562744,
  -3.5668461322784424,
  -3.536710739135742,
  -3.246518135070801,
  -2.984776258468628,
  -2.5063650608062744,
  -2.1757652759552,
  -2.1602022647857666,
  -2.0873541831970215,
  -1.5151927471160889,
  -1.4542869329452515,
  -1.1788396835327148,
  -0.8593584895133972,
  -0.7335134744644165,
  -0.6816907525062561,
  -0.4891888499259949,
  -0.14525583386421204,
  -0.033781249076128006,
  0.051106635481119156,
  0.09776199609041214,
  0.2803879678249359,
  0.3827650845050812,
  0.41057130694389343,
  0.4220901429653168,
  0.43596383929252625,
  0.7624120116233826,
  0.8251444101333618,
  0.8379709720611572,
  1.0531983375549316,
  1.2095310688018799,
  1.2109894752502441,
  1.2263344526290894,
  1.2316755056381226,
  1.253281831741333,
  1.4619308710098267,
  1.5248931646347046,
  1.5998305082321167,
  1.6438595056533813,
  1.7019389867782593,
  1.7497583627700806,
  1.7850943803787231,
  1.9090650081634521,
  2.093653678894043,
  2.111670970916748,
  2.2521846294403076,
  2.605959415435791,
  2.617387056350708,
  2.8257105350494385,
  2.9171321392059326,
  2.958181142807007,
  2.977219343185425,
  3.416025400161743,
  3.4202795028686523,
  3.6240475177764893,
  3.6499102115631104,
  3.7481393814086914,
  3.9608192443847656,
  4.044590950012207,
  4.554568290710449,
  4.610245227813721,
  4.745866775512695,
  4.841818332672119,
  4.972238063812256,
  4.972370147705078,
  4.994514465332031,
  5.055719375610352,
  5.212613582611084,
  5.24606466293335,
  5.523175239562988,
  5.658096790313721,
  5.867574691772461,
  6.120970249176025,
  6.329767227172852,
  6.349868297576904,
  6.385800361633301,
  6.562595844268799,
  6.569463729858398,
  6.693495273590088,
  6.826439380645752,
  6.868060111999512,
  7.033170223236084,
  7.341447353363037,
  7.794949054718018,
  7.83174467086792,
  8.151607513427734,
  8.44259262084961,
  8.457537651062012,
  8.622756004333496,
  9.172985076904297,
  10.818984031677246,
  11.475016593933105,
  12.081933975219727,
  12.945302963256836,
  12.945521354675293,
  13.179908752441406],
 [-7.713510990142822,
  -7.226686954498291,
  -5.746126174926758,
  -4.231037616729736,
  -3.643665313720703,
  -3.580137252807617,
  -3.5289597511291504,
  -3.4989171028137207,
  -3.2096168994903564,
  -2.9486801624298096,
  -2.47174072265625,
  -2.142157793045044,
  -2.1266424655914307,
  -2.054018497467041,
  -1.4836169481277466,
  -1.422898530960083,
  -1.1482985019683838,
  -0.829800009727478,
  -0.7043420076370239,
  -0.6526787281036377,
  -0.4607689380645752,
  -0.11789380013942719,
  -0.006762102246284485,
  0.07786467671394348,
  0.12437653541564941,
  0.3064407706260681,
  0.408502995967865,
  0.43622371554374695,
  0.44770708680152893,
  0.4615381062030792,
  0.7869821786880493,
  0.8495216369628906,
  0.8623087406158447,
  1.0768741369247437,
  1.232725977897644,
  1.2341798543930054,
  1.2494776248931885,
  1.2548022270202637,
  1.2763421535491943,
  1.4843493700027466,
  1.547118067741394,
  1.6218249797821045,
  1.6657185554504395,
  1.7236193418502808,
  1.7712914943695068,
  1.8065189123153687,
  1.9301081895828247,
  2.1141293048858643,
  2.1320908069610596,
  2.272172451019287,
  2.624859094619751,
  2.636251449584961,
  2.8439342975616455,
  2.935074806213379,
  2.9759974479675293,
  2.9949772357940674,
  3.4324333667755127,
  3.4366743564605713,
  3.63981556892395,
  3.6655988693237305,
  3.76352596282959,
  3.9755516052246094,
  4.059065818786621,
  4.567473888397217,
  4.622980117797852,
  4.75818395614624,
  4.8538408279418945,
  4.983859539031982,
  4.9839911460876465,
  5.006067276000977,
  5.067083835601807,
  5.223495960235596,
  5.2568440437316895,
  5.533102035522461,
  5.667608737945557,
  5.876441955566406,
  6.129057884216309,
  6.337213039398193,
  6.35725212097168,
  6.393074035644531,
  6.5693254470825195,
  6.576172351837158,
  6.699821949005127,
  6.832357406616211,
  6.873850345611572,
  7.038452625274658,
  7.345781326293945,
  7.797888278961182,
  7.834570407867432,
  8.153450012207031,
  8.4435396194458,
  8.458438873291016,
  8.623148918151855,
  9.171685218811035,
  10.8126220703125,
  11.466635704040527,
  12.071686744689941,
  12.93239974975586,
  12.932618141174316,
  13.166284561157227],
 [-7.672260761260986,
  -7.186653137207031,
  -5.709791660308838,
  -4.198488712310791,
  -3.612584114074707,
  -3.5492148399353027,
  -3.4981651306152344,
  -3.4681975841522217,
  -3.1796202659606934,
  -2.91933536529541,
  -2.4435875415802,
  -2.11482834815979,
  -2.099351644515991,
  -2.026909112930298,
  -1.457932949066162,
  -1.3973662853240967,
  -1.1234523057937622,
  -0.8057495951652527,
  -0.6806051135063171,
  -0.6290708780288696,
  -0.43764063715934753,
  -0.0956222265958786,
  0.015231793746352196,
  0.09964711964130402,
  0.14604276418685913,
  0.32765209674835205,
  0.4294593036174774,
  0.457110732793808,
  0.468565434217453,
  0.48236188292503357,
  0.806992769241333,
  0.869376003742218,
  0.8821310997009277,
  1.0961604118347168,
  1.2516227960586548,
  1.2530730962753296,
  1.268332600593567,
  1.273643970489502,
  1.2951301336288452,
  1.502617597579956,
  1.5652294158935547,
  1.639749526977539,
  1.6835334300994873,
  1.7412896156311035,
  1.7888426780700684,
  1.8239821195602417,
  1.9472625255584717,
  2.130823850631714,
  2.148740530014038,
  2.2884721755981445,
  2.64027738571167,
  2.651641368865967,
  2.8588054180145264,
  2.9497179985046387,
  2.9905385971069336,
  3.0094707012176514,
  3.445833921432495,
  3.4500644207000732,
  3.652698040008545,
  3.6784167289733887,
  3.77609920501709,
  3.9875950813293457,
  4.0709004402160645,
  4.578038692474365,
  4.633405685424805,
  4.768272399902344,
  4.86368989944458,
  4.993383407592773,
  4.9935150146484375,
  5.015536308288574,
  5.076399803161621,
  5.232420921325684,
  5.26568603515625,
  5.541253566741943,
  5.675424575805664,
  5.883735656738281,
  6.135720729827881,
  6.343355655670166,
  6.363344669342041,
  6.39907693862915,
  6.574888229370117,
  6.581717491149902,
  6.705058574676514,
  6.837263107299805,
  6.878652095794678,
  7.042842864990234,
  7.3494038581848145,
  7.800381183624268,
  7.836971759796143,
  8.155054092407227,
  8.444419860839844,
  8.459280967712402,
  8.623579978942871,
  9.170745849609375,
  10.807581901550293,
  11.459961891174316,
  12.06350040435791,
  12.922063827514648,
  12.922280311584473,
  13.155364036560059],
 [-7.63875675201416,
  -7.154134273529053,
  -5.680269718170166,
  -4.17203426361084,
  -3.5873184204101562,
  -3.5240776538848877,
  -3.4731316566467285,
  -3.4432246685028076,
  -3.155233144760132,
  -2.8954765796661377,
  -2.420694351196289,
  -2.092602014541626,
  -2.0771567821502686,
  -2.004861354827881,
  -1.4370397329330444,
  -1.3765959739685059,
  -1.1032378673553467,
  -0.7861799001693726,
  -0.661289393901825,
  -0.6098597645759583,
  -0.41881799697875977,
  -0.07749363034963608,
  0.03313542529940605,
  0.11737944930791855,
  0.16368094086647034,
  0.34492170810699463,
  0.4465223252773285,
  0.474117636680603,
  0.48554909229278564,
  0.49931755661964417,
  0.8232896327972412,
  0.8855462670326233,
  0.8982754945755005,
  1.1118704080581665,
  1.2670173645019531,
  1.2684646844863892,
  1.2836933135986328,
  1.2889938354492188,
  1.3104363679885864,
  1.517502784729004,
  1.5799875259399414,
  1.6543564796447754,
  1.6980515718460083,
  1.7556904554367065,
  1.8031470775604248,
  1.8382152318954468,
  1.9612454175949097,
  2.1444342136383057,
  2.1623146533966064,
  2.301762580871582,
  2.6528539657592773,
  2.6641948223114014,
  2.870938301086426,
  2.9616665840148926,
  3.00240421295166,
  3.0212981700897217,
  3.456775665283203,
  3.4609975814819336,
  3.663220167160034,
  3.6888866424560547,
  3.7863707542419434,
  3.9974374771118164,
  4.080574035644531,
  4.5866827964782715,
  4.641937732696533,
  4.7765302658081055,
  4.871754169464111,
  5.001184940338135,
  5.001316070556641,
  5.023292541503906,
  5.084033012390137,
  5.239737510681152,
  5.272934436798096,
  5.547943115234375,
  5.6818413734436035,
  5.889730453491211,
  6.141203880310059,
  6.348417282104492,
  6.36836576461792,
  6.404025554656982,
  6.579480171203613,
  6.5862956047058105,
  6.709386348724365,
  6.841322422027588,
  6.882627487182617,
  7.046485424041748,
  7.352424144744873,
  7.802485942840576,
  7.83900260925293,
  8.156439781188965,
  8.44521713256836,
  8.460049629211426,
  8.624013900756836,
  9.170069694519043,
  10.803584098815918,
  11.45464038848877,
  12.056954383850098,
  12.913774490356445,
  12.913991928100586,
  13.146601676940918],
 [-7.611539840698242,
  -7.127716064453125,
  -5.656280517578125,
  -4.1505303382873535,
  -3.5667781829833984,
  -3.5036416053771973,
  -3.452779769897461,
  -3.422921895980835,
  -3.1354050636291504,
  -2.8760764598846436,
  -2.402076482772827,
  -2.0745251178741455,
  -2.059105396270752,
  -1.986928939819336,
  -1.4200431108474731,
  -1.3596988916397095,
  -1.0867912769317627,
  -0.7702558040618896,
  -0.6455711126327515,
  -0.5942262411117554,
  -0.4034992754459381,
  -0.06273742020130157,
  0.047709330916404724,
  0.13181452453136444,
  0.17803971469402313,
  0.35898181796073914,
  0.46041497588157654,
  0.48796483874320984,
  0.49937742948532104,
  0.5131232142448425,
  0.8365614414215088,
  0.8987154364585876,
  0.9114237427711487,
  1.1246665716171265,
  1.2795579433441162,
  1.2810028791427612,
  1.2962063550949097,
  1.3014981746673584,
  1.3229053020477295,
  1.5296305418014526,
  1.5920122861862183,
  1.666258692741394,
  1.7098817825317383,
  1.7674256563186646,
  1.8148040771484375,
  1.8498144149780273,
  1.972641944885254,
  2.1555287837982178,
  2.17337965965271,
  2.3125979900360107,
  2.6631107330322266,
  2.6744329929351807,
  2.880835771560669,
  2.971414566040039,
  3.0120849609375,
  3.030947685241699,
  3.465707778930664,
  3.4699225425720215,
  3.671811819076538,
  3.6974360942840576,
  3.794759511947632,
  4.005478382110596,
  4.088478088378906,
  4.593752861022949,
  4.648916721343994,
  4.783287048339844,
  4.878354549407959,
  5.007571697235107,
  5.007702827453613,
  5.029642581939697,
  5.090282917022705,
  5.245730876922607,
  5.278873443603516,
  5.553429126739502,
  5.687106609344482,
  5.894652843475342,
  6.145711898803711,
  6.352583885192871,
  6.372499465942383,
  6.408100605010986,
  6.583265781402588,
  6.5900702476501465,
  6.712958335876465,
  6.844676494598389,
  6.885913848876953,
  7.049501419067383,
  7.354936122894287,
  7.804256439208984,
  7.840712547302246,
  8.15762710571289,
  8.445928573608398,
  8.460736274719238,
  8.624430656433105,
  9.169586181640625,
  10.800409317016602,
  11.45039176940918,
  12.051713943481445,
  12.907122611999512,
  12.90733814239502,
  13.139565467834473],
 [-7.589427947998047,
  -7.1062517166137695,
  -5.63678503036499,
  -4.133049488067627,
  -3.5500783920288086,
  -3.4870262145996094,
  -3.436232328414917,
  -3.406414747238159,
  -3.1192824840545654,
  -2.8603007793426514,
  -2.386935234069824,
  -2.059821844100952,
  -2.0444228649139404,
  -1.97234308719635,
  -1.4062156677246094,
  -1.3459522724151611,
  -1.073409914970398,
  -0.757297933101654,
  -0.6327800750732422,
  -0.5815038681030273,
  -0.3910321295261383,
  -0.050726234912872314,
  0.0595727264881134,
  0.14356538653373718,
  0.1897287219762802,
  0.3704287111759186,
  0.4717261493206024,
  0.49923914670944214,
  0.5106364488601685,
  0.5243638753890991,
  0.8473693132400513,
  0.9094401597976685,
  0.9221314191818237,
  1.1350890398025513,
  1.2897729873657227,
  1.2912160158157349,
  1.3063991069793701,
  1.3116838932037354,
  1.3330624103546143,
  1.53951096534729,
  1.6018093824386597,
  1.67595636844635,
  1.7195210456848145,
  1.7769880294799805,
  1.8243030309677124,
  1.8592665195465088,
  1.9819296598434448,
  2.164571762084961,
  2.182398796081543,
  2.3214306831359863,
  2.6714744567871094,
  2.68278169631958,
  2.8889081478118896,
  2.979365825653076,
  3.019981861114502,
  3.0388193130493164,
  3.4729976654052734,
  3.4772069454193115,
  3.678825855255127,
  3.704415798187256,
  3.8016092777252197,
  4.0120463371276855,
  4.094934463500977,
  4.5995330810546875,
  4.654623031616211,
  4.788814067840576,
  4.883754253387451,
  5.012798309326172,
  5.012929439544678,
  5.034840106964111,
  5.095399379730225,
  5.250638961791992,
  5.2837371826171875,
  5.557925224304199,
  5.691424369812012,
  5.898692607879639,
  6.149415969848633,
  6.356010913848877,
  6.3759002685546875,
  6.4114532470703125,
  6.586384296417236,
  6.593179702758789,
  6.715902805328369,
  6.847445487976074,
  6.888627052307129,
  7.051996231079102,
  7.357022285461426,
  7.805741310119629,
  7.842148303985596,
  8.158638954162598,
  8.446555137634277,
  8.461341857910156,
  8.624817848205566,
  9.169244766235352,
  10.797884941101074,
  11.44699764251709,
  12.047514915466309,
  12.901779174804688,
  12.901994705200195,
  13.1339111328125],
 [-7.571461200714111,
  -7.088809967041016,
  -5.620939254760742,
  -4.118837833404541,
  -3.5364997386932373,
  -3.4735164642333984,
  -3.4227776527404785,
  -3.3929922580718994,
  -3.1061720848083496,
  -2.8474717140197754,
  -2.3746204376220703,
  -2.0478625297546387,
  -2.032480239868164,
  -1.960478663444519,
  -1.3949663639068604,
  -1.3347684144973755,
  -1.062522053718567,
  -0.7467535138130188,
  -0.6223708987236023,
  -0.5711504220962524,
  -0.38088560104370117,
  -0.040949393063783646,
  0.06922974437475204,
  0.1531311571598053,
  0.19924433529376984,
  0.37974801659584045,
  0.4809354245662689,
  0.5084185004234314,
  0.5198034644126892,
  0.5335159301757812,
  0.8561704754829407,
  0.9181739091873169,
  0.930851399898529,
  1.1435775756835938,
  1.298093557357788,
  1.2995350360870361,
  1.3147016763687134,
  1.3199806213378906,
  1.3413360118865967,
  1.547560214996338,
  1.6097909212112427,
  1.6838574409484863,
  1.727374792098999,
  1.7847793102264404,
  1.832042932510376,
  1.8669683933258057,
  1.989498257637024,
  2.1719419956207275,
  2.1897497177124023,
  2.3286306858062744,
  2.6782939434051514,
  2.689588785171509,
  2.895491600036621,
  2.9858508110046387,
  3.0264227390289307,
  3.0452396869659424,
  3.4789464473724365,
  3.4831509590148926,
  3.6845510005950928,
  3.710113286972046,
  3.8072009086608887,
  4.017409324645996,
  4.100207805633545,
  4.604258060455322,
  4.65928840637207,
  4.793333530426025,
  4.88817024230957,
  5.0170745849609375,
  5.017205238342285,
  5.039092063903809,
  5.09958553314209,
  5.254656791687012,
  5.287718772888184,
  5.561609268188477,
  5.694962978363037,
  5.902006149291992,
  6.152457237243652,
  6.358827590942383,
  6.378695011138916,
  6.414209842681885,
  6.588951110839844,
  6.595738887786865,
  6.718328952789307,
  6.849728107452393,
  6.890865325927734,
  7.054056644439697,
  7.35875129699707,
  7.80698299407959,
  7.843350887298584,
  8.159497261047363,
  8.447100639343262,
  8.461872100830078,
  8.62516975402832,
  9.169004440307617,
  10.795876502990723,
  11.444284439086914,
  12.044148445129395,
  12.89748477935791,
  12.897700309753418,
  13.129364013671875],
 [-7.556859493255615,
  -7.074634075164795,
  -5.608058452606201,
  -4.107281684875488,
  -3.5254576206207275,
  -3.4625296592712402,
  -3.4118356704711914,
  -3.3820767402648926,
  -3.0955095291137695,
  -2.8370375633239746,
  -2.364603042602539,
  -2.038133382797241,
  -2.0227646827697754,
  -1.9508267641067505,
  -1.3858133554458618,
  -1.325668454170227,
  -1.0536623001098633,
  -0.7381722927093506,
  -0.6138994693756104,
  -0.5627241134643555,
  -0.3726271688938141,
  -0.03299083933234215,
  0.07709110528230667,
  0.1609184890985489,
  0.20699100196361542,
  0.3873354494571686,
  0.4884335994720459,
  0.5158924460411072,
  0.527267336845398,
  0.5409677028656006,
  0.8633376359939575,
  0.9252863526344299,
  0.9379526376724243,
  1.1504912376403809,
  1.304870843887329,
  1.306311011314392,
  1.3214643001556396,
  1.326738715171814,
  1.3480751514434814,
  1.5541175603866577,
  1.61629319190979,
  1.6902943849563599,
  1.7337733507156372,
  1.7911272048950195,
  1.8383492231369019,
  1.873243808746338,
  1.9956656694412231,
  2.177948236465454,
  2.1957404613494873,
  2.334498882293701,
  2.6838538646698,
  2.695138692855835,
  2.9008595943450928,
  2.9911391735076904,
  3.031675338745117,
  3.050475835800171,
  3.483799695968628,
  3.4880008697509766,
  3.689223051071167,
  3.7147626876831055,
  3.81176495552063,
  4.021787643432617,
  4.104513168334961,
  4.608119010925293,
  4.663100719451904,
  4.797027587890625,
  4.891780853271484,
  5.020571231842041,
  5.0207014083862305,
  5.042569160461426,
  5.103009223937988,
  5.257943630218506,
  5.290976524353027,
  5.564625263214111,
  5.697861671447754,
  5.904722213745117,
  6.154952049255371,
  6.361140727996826,
  6.380990505218506,
  6.416473865509033,
  6.591060638427734,
  6.597842693328857,
  6.720324516296387,
  6.8516082763671875,
  6.892708778381348,
  7.055756568908691,
  7.360182285308838,
  7.808018207550049,
  7.844354152679443,
  8.160221099853516,
  8.44757080078125,
  8.462329864501953,
  8.625483512878418,
  9.168838500976562,
  10.794275283813477,
  11.442111015319824,
  12.0414457321167,
  12.89402961730957,
  12.894245147705078,
  13.125704765319824],
 [-7.544992446899414,
  -7.063112258911133,
  -5.5975871086120605,
  -4.0978851318359375,
  -3.5164780616760254,
  -3.4535951614379883,
  -3.402937412261963,
  -3.373199701309204,
  -3.0868377685546875,
  -2.8285508155822754,
  -2.356454849243164,
  -2.030219078063965,
  -2.0148613452911377,
  -1.9429749250411987,
  -1.3783661127090454,
  -1.318264365196228,
  -1.0464529991149902,
  -0.7311890125274658,
  -0.6070051789283752,
  -0.555866539478302,
  -0.3659057021141052,
  -0.026512641459703445,
  0.08349045366048813,
  0.16725780069828033,
  0.2132973074913025,
  0.3935125768184662,
  0.4945383071899414,
  0.5219774842262268,
  0.5333442687988281,
  0.5470348000526428,
  0.8691738247871399,
  0.9310781359672546,
  0.9437353610992432,
  1.1561217308044434,
  1.310390830039978,
  1.311829924583435,
  1.3269723653793335,
  1.3322429656982422,
  1.3535641431808472,
  1.5594589710235596,
  1.6215901374816895,
  1.6955382823944092,
  1.7389861345291138,
  1.796298861503601,
  1.843487024307251,
  1.878356695175171,
  2.0006906986236572,
  2.182842969894409,
  2.200622320175171,
  2.3392813205718994,
  2.6883859634399414,
  2.699662685394287,
  2.9052364826202393,
  2.9954514503479004,
  3.0359585285186768,
  3.0547454357147217,
  3.4877591133117676,
  3.491956949234009,
  3.693035125732422,
  3.7185566425323486,
  3.8154892921447754,
  4.02536153793335,
  4.108027458190918,
  4.611272811889648,
  4.666214942932129,
  4.800045967102051,
  4.894731521606445,
  5.0234293937683105,
  5.023560047149658,
  5.045412063598633,
  5.105808734893799,
  5.260632038116455,
  5.293641567230225,
  5.567094326019287,
  5.700234889984131,
  5.906947612762451,
  6.156998157501221,
  6.363039016723633,
  6.382874488830566,
  6.418332576751709,
  6.592794418334961,
  6.599571228027344,
  6.721965789794922,
  6.853155136108398,
  6.894226551055908,
  7.057157039642334,
  7.361364841461182,
  7.80888032913208,
  7.845190048217773,
  8.160831451416016,
  8.447975158691406,
  8.462722778320312,
  8.625760078430176,
  9.168725967407227,
  10.792997360229492,
  11.440369606018066,
  12.039276123046875,
  12.89124870300293,
  12.891464233398438,
  13.122757911682129]]
len(yhat_history)
30
len(yhat_history[0]) #0에 100개... [1]에 100개.. 
100
plt.plot(x,y,'o')
plt.plot(x,yhat_history[2],'--')

plt.plot(x,y,'o')
plt.plot(x,yhat_history[9],'--')

plt.plot(x,y,'o')
plt.plot(x,yhat_history[14],'--')

- \(\hat{\bf W}\) 관찰

What_history
[[-3.657747745513916, 8.81106948852539],
 [-2.554811477661133, 7.861191749572754],
 [-1.649186134338379, 7.101552963256836],
 [-0.9060712456703186, 6.49347448348999],
 [-0.2966785430908203, 6.006272315979004],
 [0.20277434587478638, 5.615575313568115],
 [0.6119105815887451, 5.302003383636475],
 [0.9469034671783447, 5.050129413604736],
 [1.2210699319839478, 4.847657680511475],
 [1.4453645944595337, 4.684779167175293],
 [1.6287915706634521, 4.553659439086914],
 [1.778746247291565, 4.448036193847656],
 [1.90129816532135, 4.3628973960876465],
 [2.0014259815216064, 4.294229507446289],
 [2.0832109451293945, 4.238814353942871],
 [2.149996757507324, 4.194070339202881],
 [2.204521894454956, 4.157923698425293],
 [2.249027729034424, 4.128708839416504],
 [2.285348415374756, 4.105085849761963],
 [2.31498384475708, 4.0859761238098145],
 [2.339160442352295, 4.070511341094971],
 [2.3588807582855225, 4.057991027832031],
 [2.3749637603759766, 4.0478515625],
 [2.3880786895751953, 4.039637088775635],
 [2.3987717628479004, 4.032979965209961],
 [2.40748929977417, 4.027583599090576],
 [2.414595603942871, 4.023208141326904],
 [2.4203879833221436, 4.019659042358398],
 [2.4251089096069336, 4.016779899597168],
 [2.4289560317993164, 4.014443874359131]]

- loss 관찰

loss_history
[8587.6875,
 5675.2109375,
 3755.637451171875,
 2489.581787109375,
 1654.0390625,
 1102.3206787109375,
 737.8441162109375,
 496.96514892578125,
 337.7142028808594,
 232.39694213867188,
 162.72906494140625,
 116.63263702392578,
 86.1263656616211,
 65.93397521972656,
 52.566444396972656,
 43.71583557128906,
 37.855220794677734,
 33.974090576171875,
 31.403636932373047,
 29.701112747192383,
 28.57339096069336,
 27.826366424560547,
 27.331483840942383,
 27.003639221191406,
 26.78643798828125,
 26.642536163330078,
 26.547197341918945,
 26.48402976989746,
 26.442174911499023,
 26.414440155029297]
plt.plot(loss_history)

학습과정을 animation으로 시각화

from matplotlib import animation
plt.rcParams['figure.figsize'] = (7.5,2.5)
plt.rcParams["animation.html"] = "jshtml" 

- 왼쪽에는 \((x_i,y_i)\) and \((x_i,\hat{y}_i)\) 을 그리고 오른쪽에는 \(loss(w_0,w_1)\) 을 그릴것임

fig = plt.figure()
ax1 = fig.add_subplot(1, 2, 1)
ax2 = fig.add_subplot(1, 2, 2, projection='3d')

# 왼쪽 2d 오른쪽 3d 축만 생긴다

- 왼쪽그림!

ax1.plot(x,y,'o')
line, = ax1.plot(x,yhat_history[0]) # 나중에 애니메이션 할때 필요해요..
fig

- 오른쪽 그림1: \(loss(w_0,w_1)\)

_w0 = np.arange(-6, 11, 0.5) ## 파란색곡면을 그리는 코드 (시작) 
_w1 = np.arange(-6, 11, 0.5)
w1,w0 = np.meshgrid(_w1,_w0)
lss=w0*0
for i in range(len(_w0)):
    for j in range(len(_w1)):
        lss[i,j]=torch.sum((y-_w0[i]-_w1[j]*x)**2)
ax2.plot_surface(w0, w1, lss, rstride=1, cstride=1, color='b',alpha=0.35) ## 파란색곡면을 그리는 코드(끝) 
ax2.azim = 40  ## 3d plot의 view 조절 
ax2.dist = 8   ## 3d plot의 view 조절 
ax2.elev = 5   ## 3d plot의 view 조절 
fig

- 오른쪽 그림2: \((w_0,w_1)=(2.5,4)\)\(loss(2.5,4)\) 값 <- loss 함수가 최소가 되는 값 (이거 진짜야? ㅋㅋ)

ax2.scatter(2.5,4,torch.sum((y-2.5-4*x)**2),s=200,color='red',marker='*') ## 최소점을 표시하는 코드 (붉은색 별) 
<mpl_toolkits.mplot3d.art3d.Path3DCollection at 0x7fac8c960610>
fig

- 오른쪽 그림3: \((w_0,w_1)=(-3.66, 8.81)\)\(loss(-3.66,8.81)\)

What_history[0]
[-3.657747745513916, 8.81106948852539]
ax2.scatter(What_history[0][0],What_history[0][1],loss_history[0],color='grey') ## 업데이트되는 What을 표시하는 점 (파란색 동그라미) 
#처음 값!! 오른쪽 그림에서 저 동그라미 회색점이 별표로 가야해~~ 경사하강법생각하자!
<mpl_toolkits.mplot3d.art3d.Path3DCollection at 0x7fac8c7e5710>
fig

- 애니메이션

def animate(epoc):
    line.set_ydata(yhat_history[epoc])
    ax2.scatter(What_history[epoc][0],What_history[epoc][1],loss_history[epoc],color='grey')
    return line

ani = animation.FuncAnimation(fig, animate, frames=30)
plt.close()
ani

- 함수로 만들자..

def show_lrpr(data,history):
    x,y = data 
    loss_history,yhat_history,What_history = history 
    
    fig = plt.figure()
    ax1 = fig.add_subplot(1, 2, 1)
    ax2 = fig.add_subplot(1, 2, 2, projection='3d')

    ## ax1: 왼쪽그림 
    ax1.plot(x,y,'o')
    line, = ax1.plot(x,yhat_history[0]) 
    ## ax2: 오른쪽그림 
    _w0 = np.arange(-6, 11, 0.5) ## 파란색곡면을 그리는 코드 (시작) 
    _w1 = np.arange(-6, 11, 0.5)
    w1,w0 = np.meshgrid(_w1,_w0)
    lss=w0*0
    for i in range(len(_w0)):
        for j in range(len(_w1)):
            lss[i,j]=torch.sum((y-_w0[i]-_w1[j]*x)**2)
    ax2.plot_surface(w0, w1, lss, rstride=1, cstride=1, color='b',alpha=0.35) ## 파란색곡면을 그리는 코드(끝) 
    ax2.scatter(2.5,4,torch.sum((y-2.5-4*x)**2),s=200,color='red',marker='*') ## 최소점을 표시하는 코드 (붉은색 별) 
    ax2.scatter(What_history[0][0],What_history[0][1],loss_history[0],color='b') ## 업데이트되는 What을 표시하는 점 (파란색 동그라미) 
    ax2.azim = 40  ## 3d plot의 view 조절 
    ax2.dist = 8   ## 3d plot의 view 조절 
    ax2.elev = 5   ## 3d plot의 view 조절 

    def animate(epoc):
        line.set_ydata(yhat_history[epoc])
        ax2.scatter(np.array(What_history)[epoc,0],np.array(What_history)[epoc,1],loss_history[epoc],color='grey')
        return line

    ani = animation.FuncAnimation(fig, animate, frames=30)
    plt.close()
    return ani
show_lrpr([x,y],[loss_history,yhat_history,What_history])

\(\alpha\)에 대하여 (\(\alpha\)는 학습률)

#머신러닝에서 a는 학습률...

(1) \(\alpha=0.0001\): \(\alpha\) 가 너무 작다면? \(\to\) 비효율적이다.

loss_history = [] # 기록하고 싶은것 1  
yhat_history = [] # 기록하고 싶은것 2 
What_history = [] # 기록하고 싶은것 3 
What= torch.tensor([-5.0,10.0],requires_grad=True)
alpha=0.0001 
for epoc in range(30): 
    yhat=X@What ; yhat_history.append(yhat.data.tolist())
    loss=torch.sum((y-yhat)**2); loss_history.append(loss.item())
    loss.backward() 
    What.data = What.data-alpha * What.grad; What_history.append(What.data.tolist())
    What.grad=None
show_lrpr([x,y],[loss_history,yhat_history,What_history])

(2) \(\alpha=0.0083\): \(\alpha\)가 너무 크다면? \(\to\) 다른의미에서 비효율적이다 + 위험하다..

loss_history = [] # 기록하고 싶은것 1  
yhat_history = [] # 기록하고 싶은것 2 
What_history = [] # 기록하고 싶은것 3 
What= torch.tensor([-5.0,10.0],requires_grad=True)
alpha=0.0083
for epoc in range(30): 
    yhat=X@What ; yhat_history.append(yhat.data.tolist())
    loss=torch.sum((y-yhat)**2); loss_history.append(loss.item())
    loss.backward() 
    What.data = What.data-alpha * What.grad; What_history.append(What.data.tolist())
    What.grad=None
show_lrpr([x,y],[loss_history,yhat_history,What_history])

(3) \(\alpha=0.0085\)

loss_history = [] # 기록하고 싶은것 1  
yhat_history = [] # 기록하고 싶은것 2 
What_history = [] # 기록하고 싶은것 3 
What= torch.tensor([-5.0,10.0],requires_grad=True)
alpha=0.0085
for epoc in range(30): 
    yhat=X@What ; yhat_history.append(yhat.data.tolist())
    loss=torch.sum((y-yhat)**2); loss_history.append(loss.item())
    loss.backward() 
    What.data = What.data-alpha * What.grad.data; What_history.append(What.data.tolist())
    What.grad=None
show_lrpr([x,y],[loss_history,yhat_history,What_history])

(4) \(\alpha=0.01\)

loss_history = [] # 기록하고 싶은것 1  
yhat_history = [] # 기록하고 싶은것 2 
What_history = [] # 기록하고 싶은것 3 
What= torch.tensor([-5.0,10.0],requires_grad=True)
alpha=0.01
for epoc in range(30): 
    yhat=X@What ; yhat_history.append(yhat.data.tolist())
    loss=torch.sum((y-yhat)**2); loss_history.append(loss.item())
    loss.backward() 
    What.data = What.data-alpha * What.grad; What_history.append(What.data.tolist())
    What.grad=None
show_lrpr([x,y],[loss_history,yhat_history,What_history])

숙제

- 학습률(\(\alpha\))를 조정하며 실습해보고 스크린샷 제출

# α=0.00912
loss_history = [] 
yhat_history = [] 
What_history = [] 
What= torch.tensor([-5.0,10.0],requires_grad=True)
alpha=0.00912
for epoc in range(30): 
    yhat=X@What ; yhat_history.append(yhat.data.tolist())
    loss=torch.sum((y-yhat)**2); loss_history.append(loss.item())
    loss.backward() 
    What.data = What.data-alpha * What.grad; What_history.append(What.data.tolist())
    What.grad=None
show_lrpr([x,y],[loss_history,yhat_history,What_history])