Boostcamp AI tech 3기/TIL

TIL 2022-01-20 벡터, 행렬, 경사하강법까지

mcdn 2022. 1. 20. 19:16
반응형

#부스트캠프3기 

#TIL

Today I Learned 
Date : 2022.01.20(목)

□ Facts

 

벡터 사이의 각도 

벡터 사이의 각도는 l2 노름으로만 구할 수 있다. 

제2코사인 법칙에 의해 구할 수 있는데 식은 다음과 같다. 

 

두 벡터가 이루는 각을 찾을 때 

저 공식을 한 쪽으로 미룬 cos 각도를 구하면 된다 

각을 구하기 위해너는 두 벡터의 크기와 내적이 필요하다 

밑의 벡터는 l2 노름으로 나온 유클리드 공식 적용한 값이고 위는 내적 

그걸 콘사인 잔대를 하면 theta 값이 나온다 

 

https://ko.wikihow.com/%EB%91%90-%EB%B2%A1%ED%84%B0-%EC%82%AC%EC%9D%B4-%EA%B0%81%EB%8F%84-%EA%B5%AC%ED%95%98%EA%B8%B0

 

두 벡터 사이 각도 구하기

수학에서 벡터란 길이가 정의되고 그 크기를 알 수 있으며 방향이 있는 물체를 말합니다. 벡터는 우리가 아는 선분이나 모양이 아니므로 그들 사이의 각을 알려면 특별한 공식을 사용해야 합니

ko.wikihow.com

여길 참고하면 더 이해가 쉬움 

 

u = [2, 2]

v = [0, 3]

이라 하자 

u의 노름2 는 root8

v의 노름2는 root9로 3 

u*v는 u1v1 + u2v2로 

2 * 0 + 2 * 3 = 6 

cos법칙은 u*v/u노름 *v노름 이므로 

=6 / root8 * 3 

=1 / root2

=root2/2가 된다 

 

마지막으로 arccosine(root2/2)로 각도를 구하면

이런식 

 

 

행렬 

벡터를 원소로 가지는 2차원 배열 

numpy에서는 row 행이 기본 단위다. ---->이 가로 방향이 행

행렬을 표기할 때 row-column 순서 

 

행렬이 벡터랑 다른 점 

벡터는 공간에서 한 점을 의미한다면 행렬은 여러 점들을 나타낸다. 

행렬 xij는 i번째 데이터의 j번째 변수 값을 말한다. 

 

전치행렬 

전치행렬 transpose matrix는 행과 열의 인덱스가 바뀐 행렬을 말합니다. 

첫번째 행은 첫번째 열이 되는 것 

 

행렬의 덧셈 뺄셈 성분곱 스칼라곱 

행렬끼리 같은 모양이면 덧셈 뺄셈이 가능하다. 

 

곱셈부터 조금 다른데 

행렬 곱은 앞의 열과 두번째 행렬의 행의 개수가 같아야 한다. 

행벡터와 열 벡터 사이의 내적으로 계산되는 것이 곱셈 

3*3 3*2 매트릭스 두개라면 3행 2열이 되는 것 

 

역행렬 

import numpy as  np

Y = np.array([[1,-2,3], [7,5,0], [-2,-1,2]])
a = np.linalg.inv(Y)
print(a)

Y = np.array([[0,1], [1,-1], [-2,1]])
a = np.linalg.pinv(Y)
print(a)

b = a @ Y
print(b)

역행렬 구하는 코드 

 

 

과제 - 매번 까먹는 remove del pop 의 차이 

remove은 앞에서 찾은 1개만 삭제한다. 

list.remove('d')

 

del은 사실 함수가 아니고 명령어다. 

del은 인덱스가 필요하다 

del list[0]

 

pop은 인덱스가 필요하다 

list.pop(2) # index 2 

 

미분이란?

미분(differentiation)은 변수의 움직임에 따른 함수값의 변화를 측정하기 위한 도구로 최적화에서 제일 많이 사용하는 기법.

 

sympy 의 diff 함수를 사용하면 미분을 구할 수 있다. 

미분은 함수 f의 주어진 점 (x, f(x))에서의 접선의 기울기를 구한다.

 

미분값을 더하면 경사상승법(gradient ascent)이라 하며, 함수의 극대값의 위치를 구할 때 사용한다.

미분값을 빼면 경사하강법(gradient descent)이라 하며, 함수의 극솟값의 위치를 구할 때 사용한다.

경사상승/경사하강 방법은 극값에 도달하면 움직임을 멈춘다.

 

극값에 도달하면 미분값이 0이므로 업데이트가 되지 않으므로 최적화가 자동으로 끝이 난다. 

 

경사하강법 : 알고리즘

종료조건이 성립하기 전까지 미분값을 계속 업데이트한다.

lr은 학습률로서 미분을 통해 업데이트하는 속도를 조절할 수 있다.

 

경사하강법이다. var = var - lr * grad 

learning rate은 중요하다. 

위의 예를 보면 x, y 둘다 입력인데 그 중 x로만 편향해서 미분한 것

 

각 변수 별로 편미분을 계싼한 그레디언트(gradient) 벡터를 이용하여 경사하강/경사상승법에 사용할 수 있다.

 

 

□ Findings 

- conda install sympy를 했음에도 불구하고 module not found error가 날 경우

가상환경에 jupyter가 잘 설치되었는지 확인하자

 

a. conda list 확인

b. conda install jupyter 설치

c. jupyter notebook으로 실행

 

 

jupyter notebook : ModuleNotFoundError 모듈 설치했는데도..

우선 gradient descent 문제를 풀기 위해서는 conda에 sympy를 설치해야 한다 그래서 conda install sympy로 설치를 완료했음 (upstage) ➜ stage1 git:(master) ✗ conda install sympy Collecting package metad..

so-es-immer.tistory.com

 

 

- dropout before activation? or after activation? 

 

결론만 말하면 dropout은 relu를 제외하고는 after activation이 기본적이다. 

Typically, dropout is applied after the non-linear activation function (a). However, when using rectified linear units (ReLUs), it might make sense to apply dropout before the non-linear activation (b) for reasons of computational efficiency depending on the particular code implementation.

https://sebastianraschka.com/faq/docs/dropout-activation.html

위에서 증명한건 

relu는 먼저하든 뒤에하든 결국 결과가 같게 된다고 한다

 

정리하면 Convolution - Batch Normalization - Activation - Dropout - Pooling 순서로 네트워크를 구성하면 됩니다.
https://gaussian37.github.io/dl-concept-order_of_regularization_term/

논문에서 말하기 Convolution - Normalization -Activation - Dropout - Pooling 순서로 네트워크 구성하도록 조언한다. 

 

+ 멘토링에서 설명을 들었는데 더 납득이 갔음 

relu 예시뿐만 아니라 이론적으로 접근해도 dropout이든 relu이든 의미없는 값은 0으로 취급해버리니까 순서가 중요하지 않은데 

sigmoid, tanh 같은 다른 activation function은 1/(1+e-x) 에서 x에 값이 들어갈 때 dropout이 먼저면 값이 사라져 버리고 dropout이 뒤면 크게 영향가고 그런 식이라 순서가 달라지면 결과가 너무 달라지게 된다. 

 

공식으로 증명해보면 더 이해가고 오래 기억나지 않을까?

 

dropout이 끝난 후에 정보량을 보충하기 위해 값을 더한다는 사실도 오늘 알았다. 

역시 개념을 제대로 알고 넘어가야한다는 생각이 강력하게 든 오늘 멘토링.. 

 

 

- 과제에서 반례 하나 더 찾음 EXAMPLE 한 글자인 경우 

예외처리 하자 

 

 

 

□ Feelings 

오늘 아침에는 컴퓨터가 꺼져서,

오후에 멘토링은 시간을 10분 늦게 알아서 구멍이었던 하루

내일은 시간 맞춰서 효율적으로 움직이고 싶다. 

 

공부에 관해서는.. 프리코스에서 공부했었지만 사실 모두 잊어버린 것 같다.

얼추 들어보니까 경사하강법까지는 기억하긴 했지만 

멘토링을 들으면서 너무 얕게 공부했다는 기분이 들었다. 

 

개념만 흐릿하게 이해하고 막상 설명하라고 못 설명할 것 같은 느낌. 

지금은 강의 듣기에 급급하지만 주말에는 개념 복습을 해야할 것 같다 

 

 

 

 

 

□ Future

1/21 데일리 스크럼

10-12시  :  확률론 맛보기

1-4시 : 통계학 맛 보기 

5-9시  : CNN, RNN 강의 듣기 

 

내일은 랜덤피어, 피어세션이 있음 

 

반응형

'Boostcamp AI tech 3기 > TIL' 카테고리의 다른 글

TIL 2022-01-24(월) pytorch basics  (0) 2022.01.24
TIL 2022-01-21(금) cnn, rnn  (0) 2022.01.24
TIL 2022-01-19 시작  (0) 2022.01.19