기본 콘텐츠로 건너뛰기

Deep Learning Term

Activation Function

-sigmoid Function
-tanh Function
-absolute Function
-ReLU Function

AlexNet

Argumentation

BackPropagation
역파장.

Batch Normalization

normalization을 하는 이유
입력 변수가 선형적으로 결합된다면 적어도 이론 상으로는 입력을 표준화하는 것이 거의 필요하지 않습니다.
그 이유는 해당 weight bias를 변경하여 입력 벡터를 재조정하면 이전과 완전히 똑같은 결과를 남길 수 있기 때문입니다.
그러나 입력을 표준화하면 학습을 더 빨리하고 지역 최적의 상태에 빠지게 될 가능성을 줄이는 다양한 실용적인 이유가 있습니다.
또한, 표준화 된 입력을 통해 Gradient Descent  Bayesian estimation을 보다 편리하게 수행 할 수 있습니다.



Batch Normalization Algorithm
mean = 평균
variance = 분산
gamma = Scalar factor, Scale
beta = Shift factor, Shift (bias 역할 대체 가능)

장점

기존 Deep Network에서는 learning rate를 너무 높게 잡을 경우 gradientexplode/vanish 하거나, 나쁜 local minimal에 빠지는 문제가 있었다. 이는 parameter들의 scale 때문인데, Batch Normalization을 사용할 경우 propagation 할 때 parameterscale에 영향을 받지 않게 된다. 따라서, learning rate를 크게 잡을 수 있게 되고 이는 빠른 학습을 가능케 한다.



Dropout을 같이 사용하지 말 것.


직관적 이해
아래와 같이 Unnormalized된 상태에서는 Learning Rate을 매우 작게 설정해야 정상적을 학습이 된다.
이유는 cost 그래프가 elongated하기 때문이다. 따라서 elongated contour의 모습을 가진다.
아래와 같이 Input의 Range가 서로 다르다면 Gradient Descent Algorithm을 적용하는것이 매우 까다로워지는 상황이 발생 한다.
하지만 normalization을 적용하면 좀 더 spherical contour를 가지게 된다.
이렇게 하면 좀 더 Gradient Descent Algorithm으로 쉽게 그리고 빠르게 최적화 지점을 찾게 된다.


출처: http://goodtogreate.tistory.com/entry/Neural-Network-적용-전에-Input-data를-Normalize-해야-하는-이유 [GOOD to GREAT]

출처: https://blog.naver.com/acelhj/221155064510


CNN(Convolutional Neural Network)

CaffeNet

Chain Rule
우리는 함수의 합성을 통하여 수많은 함수를 새롭게 생성하고 사용한다. 이러한 합성함수의 미분은 연쇄법칙에 의하여 얻어질 수 있다. 연쇄법칙은 '연쇄'라는 단어가 의미하는 것처럼 어떤 변수의 변화가 매개변수의 변화를 유발하고 그 매개변수의 변화가 다시 최종함숫값의 변화를 유발하는 연쇄작용을 의미하는데 이러한 최종변화율은 중간변화율들의 곱으로 나타난다.
출처 : [네이버 지식백과] 연쇄법칙 [chain rule] (수학백과, 2015.5, 대한수학회)

Classification

Concatenation
이어서 붙이는 것.

Convolution
합성 곱. 필터와 이미지를 곱하는 역할.
중첩 적분을 의미하는 수학 연산자로, 어떠한 함수가 두 개 존재할 때 두 함수 중 하나를 반전 시킨 후 이동한 값을 나머지 다른 함수에 곱한 다음에, 각 구간에 대하여 적분을 함으로써 새로운 함수를 만들어내는 것이다. 합성 곱이라고도 하며, 만약 함수 f와 함수 g를 콘볼루션 한다고 할 때, 수학 기호로는 f*g와 같이 표기한다.


출처 : [네이버 지식백과] 콘볼루션 [Convolution] (두산백과)

이런 식으로 계산하고 zero padding, stride에 따라 출력 크기가 결정된다.
주변 값과의 평준화 느낌.

Convolutional Layer
Convolutional layer를 거칠수록 크기는 작아지지만 두께는 두꺼워지는 것이 일반적이다.


(32-5) / 1 + 1 = 28, 6개의 Filter -> 6개의 Channel
Filter 하나를 거칠 때마다 Channel 하나 생성.
Cross-Entropy Cost


Cross-Validation
DeConvNet
DenseNet
Dropout
Fully Connected
Fully Convolutional Network(FCN)
Instance Segmentation
GoogleNet
Gradient Descent
기울기
Initialization
Linear Regression
통계학에서, 선형 회귀(線型回歸, 영어: linear regression)는 
종속 변수 y와 한 개 이상의 독립 변수 (또는 설명 변수) X와의 선형 상관 관계를 
모델링하는 회귀분석 기법이다.

y = 종속 변수
x = 설명 변수
B = 독립 변수
e = 오차항

{\displaystyle \mathbf {y} =\mathbf {X} {\boldsymbol {\beta }}+{\boldsymbol {\varepsilon }},\,}

출처 : https://ko.wikipedia.org/wiki/%EC%84%A0%ED%98%95_%ED%9A%8C%EA%B7%80[위키백과]

Localization
Loss Function (=Cost Function)
LSTM

NIN(Network In Network)
Overfitting
PathNet



Pooling
Pooling의 다른 말은 sampling 또는 resizing이다.  
떤 작업을 하건 pooling을 거치면 크기가 작아진다는 것이 핵심이다. 
(Zero Padding시에는 다름.)



MaxPooling

필터의 값 중에서 가장 큰 값을 꺼내서 모아 놓는 것을 뜻한다.

AveragePooling

필터의 값 중에서 평균 값을 구해 모아 놓는 것을 뜻한다.

출처: http://pythonkim.tistory.com/53?category=573319 [파이쿵]

RNN(Recurrent Neural Network)
ReLU(Rectified Linear Units)

Reseptive Field ResNet
정확도가 높은 편이지만 속도가 매우 느리다



Segmentation
Pixel-wise Prediction

SegNet

Sigmoid Function

Softmax Regression

Sparsity
SqueezeNet

Stride
필터가 이동하는 크기. 출력 크기가 소수가 된다면 그 Stride는 사용할 수 없다.
SubSampling
(=Pooling) UpSampling
해상도 복원

VGG-Net
VGG-16, VGG-19를 주로 사용하며 빠르지만 정확도가 낮은 편이고 메모리를 많이 사용함.

Vanishing Gradient
Weakly-Supervised Learning(Localization)

-학회
NIPS
CVPR

댓글

이 블로그의 인기 게시물

1094 : 막대기 [C++]

# include < iostream > # include < vector > using namespace std ; int main ( ) { vector < int > Stick ; Stick . push_back ( 64 ) ; int Target ; cin > > Target ; int Last = 0 ; while ( true ) { if ( Target = = 64 ) break ; int Sum = 0 ; for ( int i = 0 ; i < Stick . size ( ) ; i + + ) Sum + = Stick [ i ] ; if ( Target = = Sum ) break ; else if ( Target < Sum ) { Stick [ Last ] / = 2 ; Sum = 0 ; for ( int i = 0 ; i < Stick . size ( ) ; i + + ) Sum + = Stick [ i ] ; if ( Target < = Sum ) continue ; else Stick . push_back ( Stick [ Last + + ] ) ; } } cout < < Stick . size ( ) ; ...

2407 : 조합 (Dynamic Programming) [C++]

어려웠다. 문제를 풀면서 솔직히 이게 되려나?? 메모리 제한걸리려는게 아닌가 싶었는데 만들면서 최대한 메모리를 작게 만들었더니 맞았습니다! 주어진 입력 값은 최대 100인데, 입력값을 입력하면 오버플로우가 나므로 자릿수 배열을 만들어주어야 한다! 처음으로 한 생각은 재귀! (n == m || m == 0) 참이면 1 거짓이면 [n-1], [n]번째에 계속 접근하기 결과는 20이 넘어가면 엄청난 시간이 걸림. 두 번째 한 생각은 3차원 배열이었다. 2차원 배열에 또 배열을 만들어 자릿 수를 다 저장하려 했으나~ for문이 3개나 들어가서 시간이 엄청 오래걸렸음. 결국 2차원 배열이지만 3차원의 효과를 내게끔 선언하였다. 2차원배열이 원래이런 식이라면 1 11 121 1331 14641 내가 만든 배열은 111121133114641 즉 한 차원을 줄일 수 있었고, 각 원소에 대한 파스칼의 삼각형을 이용한 덧셈 공식은  그 줄의 자릿수 사이즈를 이용하여 전에 있는 줄에 접근하였다. DP 사용!! Answer[i] = Answer[i-Answer[i].size()] + Answer[i-Answer[i].size()+1] 그리고 저장한 자릿수들을 거꾸로 출력해주면 그것이 정답! Combination() : 각 줄의 번호만큼 자릿수를 가지는 벡터 생성, 계속 쓰는 Sum 벡터 생성 Increase() : 각 자릿수가 10이 넘어가면 올림을 해준다. GetSum() : 각 자릿수를 더해준다. GetAnswer() : DP, 올림, 출력  Combination :: Combination ( ) { this - > Sum . push_back ( 0 ) ; for ( int i = 1 ; i < = 101 ; i + + ) Sum . push_back ( S...

11401 : 이항계수 3 (Dynamic Programming, Divide and Conquer) [C++]

1번, 2번 문제들과 확연히 차이나는 입력의 범위. 400만 ! DP를 사용해서 풀 수 없는 문제이다 . 하지만 DP가 쓰이긴 한다! 수학은 너무 어렵다. 곱셈의 역원을 공부해보다가 모르겠어서 도움을 구했다. 왜 곱셈의 역원을 구해야하는가? N! / (K! * (N-K)!) 에서 K! * (N-K)! 의 역원을 구해야 하기 때문! 곱셈의 역원을 구하는 정리인 페르마의 소정리를 이용하면 p가 1000000007 이지만 분할 정복을 이용한 제곱 수 계산 덕분에 logP 시간 소요. 분할 정복을 이용한 제곱 수 계산은 계속 써먹을 것 같아서 따로 올려놓았다. DP가 쓰이는 부분은 구해준 400만의 역원을 바탕으로 모든 역원을 구하는 부분이다. 그러므로 총 시간 소요는 O(N+LogP) long long BinomialCoefficient :: GetNum ( int N , int K ) { this - > Factorial [ 1 ] = 1 ; for ( int i = 2 ; i < = 4000000 ; i + + ) this - > Factorial [ i ] = ( this - > Factorial [ i - 1 ] * i ) % P ; this - > Invert [ 4000000 ] = this - > Pow_DC ( this - > Factorial [ 4000000 ] , P - 2 ) ; for ( int i = 4000000 - 1 ; i > 0 ; i - - ) this - > Invert [ i ] = ( this - > Invert [ i + 1 ] * ( i + 1 ) ) % P ; if ( N = = K | | K = ...