인공지능의 개요

sith-call.dev·2021년 8월 29일
0

Computer Science

목록 보기
6/15
post-thumbnail

- Artificial Intelligence by geralt, Pixaby License -

딥러닝이란?

딥러닝이란?

딥러닝은 은닉칭을 갖는 신경망을 이용하여 많은 데이터로부터 특징을 자동으로 직접 학습하는 머신러닝 기법을 말함.

머신러닝과 딥러닝의 차이

개발자가 데이터의 특징을 추출하면 머신 러닝이고,
자동으로 데이터의 특징이 추출되면, 딥러닝이다.

전통적인 코딩과 ML/DL의 차이

전통적인 코딩은 내가 직접 컴퓨터에 프로그램을 설계하고 사용할 데이터를 입력하여 원하는 결과를 도출하는 방식이었다.
ML/DL은 입력값으로 사용할 데이터와 내가 원하는 결과를 컴퓨터에 입력하면 이에 대응되는 프로그램이 도출되는 방식이다. 그래서 도출된 프로그램의 내부 동작은 알 수가 없다. 컴퓨터가 도출해낸 값이기 때문이다.

왜 딥러닝을 사용하는가?

딥러닝은 머신러닝과 달리 신경망이 알아서 데이터의 특징을 학습하기 때문에 인식률이 월등히 높다. 아무리 천재적인 개발자라고 해도 인력으로 인식률을 높이는데에는 한계가 있기 때문이다.

왜 딥러닝에서 파이썬을 사용하는가?

파이썬의 장점으로는 다음이 있다.
1. 빠른 프로토타이핑 가능
2. GPU를 통해 데이터를 처리하기 때문에 개발 언어의 성능은 크게 중요하지 않음.
3.넘파이가 지원된다.(행렬계산)

머신러닝 Type

Supervised Machine Learning

  1. Data : 특정 클래스 또는 값으로 라벨링이 되어 있다.
  2. Goal : 라벨링이 된 클래스 또는 값을 예측해낸다.

즉, 내가 학습을 시키는데 문제와 정답을 같이 주는 형태의 학습방식이다. 그래서 학습의 결과물로 예측 모델을 만들어낸다. 그리고 이를 위해 Classification Algorithm을 사용한다.

Unsupervised Machine Learning

  1. Data : 데이터가 라벨링 되어 있지 않다.
  2. Goal : 데이터의 패턴을 결정하거나 데이터를 그룹핑시킨다.

정답지 없이 문제를 풀어가며 학습하는 방식이다. 그래서 이 방식에서는 self-guided learning algorithm을 이용한다. 이 알고리즘에는 genetic algorithm과 clustering algorithm이 있다.

Reinforcement Machine Learning

학습 모델의 구성
1. 환경 상태 집합 S
2. 행동 집합 A
3. 포상의 집합 R

매 시점 t에 에이전트는 자신의 상태와 가능한 s_t와 가능한 행동 A(s_t)를 가지고 있다. 에이전트는 어떤 행동 a ∈ A(s_t) 을 취하고, 환경으로부터 새로운 상태 s_t+1와 포상(reward) r_t+1을 받는다. 이 상호작용에 기반해서 강화 학습 에이전트는 누적된 포상값 R을 최대화 하는 정책(policy) π: S→A을 개발한다.

이 학습방식은 특정한 시나리오를 그려본 다음에 이해하는 것이 좋다.

시나리오
1. 에이전트과 주변 환경(environment)을 관찰(observe)
2. policy에 기반하여 행동(action)
3. reward 또는 penalty를 받음
3. policy를 update(learning)
4. 최적화된 policy를 찾을 때까지 위 과정을 반복

이번 과정에서 배운 것

이번 과정에선 supervised learning 방식의 딥러닝을 배웠다. 딥러닝은 신경망을 통해서 구현된다.

신경망 구조

이때 hidden layer가 2개 이상일 경우에 신경망이 deep하다고 하며 hidden layer가 1개이거나 없으면 shallow neural network라고 부른다.

그리고 각각의 layer은 뉴런으로 구성되어 있다.

뉴런

정의(from 위키백과)

인공 신경망을 구성하는 요소이다. 인공신경망은 기계학습과 인지과학에서 생물학의 신경망(동물의 중추신경계중 특히 뇌)에서 영감을 얻은 통계학적 학습 알고리즘이다. 인공신경망은 시냅스의 결합으로 네트워크를 형성한 인공 뉴런(노드)이 학습을 통해 시냅스의 결합 세기를 변화시켜, 문제 해결 능력을 가지는 모델 전반을 가리킨다. 좁은 의미에서는 오차역전파법을 이용한 다층 퍼셉트론을 가리키는 경우도 있지만, 이것은 잘못된 용법으로, 인공신경망은 이에 국한되지 않는다.
인공 뉴런(artificial neuron, 인공 신경)은 신경해부학적 사실을 토대로 하여 고안된 간단한 연산기능만을 갖는 처리기이다.

즉, 딥러닝은 뇌의 알고리즘을 모방하여 학습 모델을 구성한다. 그리하여 만들어낸 인공신경망은 뇌와 유사하게 인공 뉴런으로 구성되어 있다. 이제부턴 인공뉴런의 구성을 살펴본다.

위의 사진과 같이 실제 신경세포와 인공 신경은 서로 대응되는 부분이 있지만 그 실재 구성에는 약간의 차이가 있다.

입력(input)

이전 뉴런으로부터 전달 받은 값을 말한다.

가중치(weight)

입력에 부여되는 값이다. 입력값의 기여도를 나타낸다. 학습이 처음 시작될 땐 랜덤값으로 부여된다.

편향(bias)

가중치 신호 총합에 사용되는 값으로 활성화 함수에 입력되는 값을 조절한다.

가중치 신호 총합(Net input function)

입력값에 가중치를 부여하여 편향값과 함께 합해준다. 이를 통해 활성화 함수의 입력값을 만들어낸다.

활성화 함수(activation function)

역할 : 현재 뉴런의 신호를 다음 층으로 전달할지 여부를 결정
종류 : step function, sigmoid function, ReLU function
가중치 신호 총합을 입력값으로 받는다.

딥러닝 학습이란?

'학습한다'의 의미(개념적 설명)

결론부터 말하자면, 계속해서 오류를 줄여가며 최종적으로 최적화된 모델을 얻어내는 것을 말합니다. 여기서 주목할 점은 오류를 줄여간다는 점입니다. 오류를 줄이기 위해선 먼저 오류를 측정할 수 있는 방법이 필요하고 또 다시 측정된 오류값을 기반으로 오류가 줄어들게 만들 방법이 필요합니다. 그리고 오류가 처음으로 측정되는 그 최초의 상태는 랜덤값으로 주어집니다. 즉, 랜덤값을 처음에 부여하고 여기서 계속해서 오류를 줄여가는 방식입니다.

여기선 구체적인 예시를 들기 위해서 딥러닝 신경망 구조와는 다른 형태의 방식을 보겠습니다.


위와 같이 입력값이 주어졌다고 생각합니다. 여기서 문제는 입력되지 않은 다음값을 예측해내는 것입니다.

먼저 기울기가 랜덤값인 일차함수를 만들어냅니다. 그리고 여기서 오류값을 측정합니다.

여기서 사용된 오류값 측정방법은 MSE(Mean Square Error)라고 부릅니다. 즉, 내가 형성한 모델과 실제 입력값 사이의 오류를 제곱해서 부호의 의미를 지워주고 루트를 씌워서 이전에 사용한 제곱이란 연산을 무효화시키는 방법입니다.
이렇게 오류가 측정되면 오류값을 기반으로 원래의 모델을 향상시킬 수 있습니다. 대략적으로 모델이 향상되는 과정을 표현하자면 다음과 같습니다.

'학습한다'의 의미(수식적 설명)

위의 예시는 오류 측정을 위해 MSE 방식을 사용하였고 오류값을 기반으로 모델을 향상시키기 위해선 확률적 경사 하강법을 사용하였습니다. 이를 수식으로 나타내면 다음과 같습니다.


즉, SGD(Stochastic Gradient Descent, 확률적 경사 하강법) 기법을 통해서 W(위의 예시에서는 기울기)을 계속해서 갱신시키는 것입니다. 여기서 편미분계수가 0이 될 때 최적값에 도달했다고 판단하고 학습을 종료시킵니다. 그리고 에타값은 학습률을 나타냅니다.

Learning rate(학습률)


학습률이란 위와 같이 얼마만큼의 세기로 최적값에 접근할지를 나타내는 값입니다. 학습률이 너무 크면 Loss값이 발산하여 학습이 불가능하고 학습률이 너무 작으면 local minimum에 빠져서 학습이 정체될 수 있습니다. 다음은 발산하는 경우와 정체되는 경우의 그래프입니다.

Error Backpropagation

이전에 보았던 SGD는 가중치를 갱신하는 알고리즘입니다. 이것이 실제로 구현되어 가중치가 갱신되는 과정은 error backpropagation이라고 부릅니다. 즉, 여기서 한번 더 정리를 해보겠습니다.

오차역전파

딥러닝에서 인공 신경망이 학습한다의 의미는 전체 학습 데이터의 정답과 예측값 간의 오차를 조금씩 줄이는 과정을 뜻합니다. 그리고 여기서 오차를 측정하는 방법과 오차를 통해서 모델을 향상시키는 방법이 따로 있다고 했습니다. 구체적으로 위의 예시에선 오차를 측정하는 방법(알고리즘)이 MSE(Mean Square Error)였습니다. 그리고 오차를 통해서 모델을 향상시키는 방법은 SGD(Stochastic Gradient Descent, 확률적 경사 하강법)이였습니다. 그리고 오차를 통해서 모델을 향상시키는 방법이 구체적으로 구현된 것이 Error Backpropagation이라고 합니다. 이제부터는 딥러닝의 인공 신경망을 통해서 이 과정을 다시 한번 확인해보겠습니다. 간단하게 살펴보기 위해서 shallow neural network을 예시로 사용하겠습니다.

먼저 인공 신경망이 아래와 같이 있다고 가정하겠습니다. 그리고 이 인공 신경망을 통해서 Output_1, Output_2라고 예측값이 나왔다고 합시다. 이 예측값은 Error Function(위의 예시에서 MSE에 해당하는 부분)에 의해서 각각의 오류값을 측정할 수 있습니다.

그렇다면 이 측정된 오류값을 기반으로 인공 신경망을 향상시켜야 합니다. 그리고 이러한 방식으로 모델을 향상시키는 과정을 딥러닝에서는 학습이라고 말했습니다. 다시 말하면, 보다 나은 예측을 할 수 있도록 가중치 값을 갱신시키는 과정이라고 했습니다. 그리고 가중치 갱신 알고리즘은 여러 가지가 있으며 위의 예시에선 SGD를 다루었습니다. 이제 본격적으로 가중치 값이 갱신되는 과정에 대해서 대략적으로 살펴보겠습니다.


먼저 위와 같이 해당 뉴런의 Loss 값과 가중치를 아는 상황이라면 직접 미분하여 SGD에서 사용하는 미분계수를 구할 수 있다고 가정합니다. 그리고 신경망 모델에는 이미 가중치 값이 입력되어 있습니다. 따라서 모든 가중치를 갱신하기 위해선 모든 뉴런에서의 Loss값을 알아야 합니다.

먼저 Loss는 각각의 뉴런이 해당 Loss에 기여한 만큼 갖게 됩니다.

이 원리에 입각하여 좀 더 복잡한 예시를 보자면 다음과 같습니다.



이처럼 Loss값이 뒤로 전파되는 양상을 띤다하여 이를 오차역전파라고 부릅니다. 그리고 위의 알고리즘이 반복 적용되면 모든 뉴런에서의 Loss값을 계산해낼 수 있습니다. 모든 Loss값이 계산되면 처음의 가정에 의해서 각각의 뉴런에서 직접 미분하여 가중치를 갱신시킬 수 있습니다.

그럼 처음의 인공 신경망은 아래와 같이 Loss값이 전파되어 가중치를 갱신할 수 있습니다.

Chain Rule

그러나 위와 같은 방식을 사용한다면 가중치의 개수만큼 미분연산을 해야 합니다. 미분 연산은 많은 컴퓨터 자원을 필요로 합니다. 따라서 가중치 갱신을 좀 더 효율적으로 할 필요가 있습니다. 이것에 대한 해답이 Chain Rule입니다. Chain Rule은 이미 알고 있는 값을 통해서 미분 연산량을 줄이는 것을 목적으로 합니다. 그러나 자세한 내용은 생략하겠습니다.

Vanishing Gradient

back propagation 진행 시 신경망이 깊어질 수록 output layer 근처 미분계수값은 유지되지만 input layer쪽으로 갈수록 미분계수가 0이 되는 현상을 말합니다. 미분계수가 0이 되면 사실상 가중치가 갱신되지 않겠죠. 이런 문제를 방지하기 위하여 ReLU 활성화 함수를 사용하기도 합니다. 즉, 신경망이 깊을수록 ReLU 활성화 함수를 사용합니다. 자세한 내용은 생략하겠습니다.

학습(Train) vs 테스트(Predict)

데이터셋을 모으게 되면 이것을 2개로 나누게 됩니다.(3개로 나누는 경우도 있습니다.) 하나는 학습을 위해서 사용하고 나머지는 이 학습된 모델을 테스트하기 위해서 사용합니다. 학습을 완료하게 되면 하나의 가중치 파일을 얻게 되고 이 파일을 이용해서 테스트를 진행하게 됩니다.

Epoch vs Iteration

  1. 데이터가 100개 있다고 가정하겠습니다.
  2. 이때 10개의 크기로 데이터를 뽑아서 한번 학습시키겠습니다.
  3. 그리고 위의 과정을 100번 반복하여 모든 데이터를 이용하여 학습하였습니다. 이렇게 1번의 전체 데이터셋 학습을 완료하였습니다.

이를 다시 말하면 아래와 같습니다.
1. 데이터셋의 크기가 100입니다.
2. batch size 크기를 10으로 정하였습니다. 그리고 batch size만큼 1회 학습하였습니다. 이를 1번 iteration 했다고 합니다.
3. iteration을 10번 반복하여 모든 데이터셋을 학습시켰습니다. 이렇게 1 epoch 학습하였습니다.

즉, batch size만큼 데이터셋을 나눠서 1회 학습하면 이를 1번 iteration했다고 합니다. 그리고 n번 iteration하여 모든 데이터를 학습하게 되면 이를 1번 epoch했다고 합니다.

전이학습(transger learning)

이미 학습된 모델의 일부 계층의 가중치를 그대로 사용하여 적은 학습데이터로도 인식률을 향상시키는 기술을 말합니다.

Cross Entropy Error

Entropy

엔트로피는 정보이론에서 나오는 개념입니다. 핵심적인 내용만 말하자면 발생확률이 높은 정보일수록 작은 용량으로 나타내고, 발생확률이 큰 정보일 수록 큰 용량으로 나타내는 방식을 말합니다. 이와 같은 방식으로 정보를 나타내면 계속해서 통신을 주고 받는 경우에 누적되는 데이터의 용량을 줄일 수 있습니다. 즉 통신에 사용되는 데이터의 평균을 줄일 수 있습니다. 그리하여 통신 비용을 아낄 수 있습니다.

이렇게 생각할수도 있습니다. 8개의 정보를 나타내기 위해선 모든 정보가 3개의 비트를 부여받아야 합니다. 이때의 총 비트 수는 24개입니다. 그러나 이때 자주 사용되는 정보에서 비트를 때어 자주 사용되지 않는 정보에 부여합니다. 이렇게 되면 비트 수의 총량은 유지됐지만, 사용되는 빈도에 따라 효율적으로 비트가 분배되었습니다. 효율적인 자원 분배로 인해 통신 비용은 절감되는 것입니다. 이때 주의할 점은 비트와 정보 간의 맵핑이 잘 이루어져야 한다는 점입니다.

Cross Entropy Error

어떤 정보에 대해서 엔트로피 방식을 통해서 비트를 부여했다고 합시다. 그리고 내가 동일한 정보에 임의적으로 랜덤하게 비트를 부여했다고 합시다. 그러면 이 두 정보 표현 방식의 엔트로피에는 차이가 발생합니다. 이 차이를 Error로 인식하는 방법이 Cross Entropy Error입니다. 즉, CEE는 오류값 측정 방식 중에 하나입니다.

Cross Entropy Error는 MSE를 사용할 때보다 신경망의 인식률을 더 높여준다고 알려져 있습니다.

One-Hot Encoding

문자를 숫자로 바꾸는 기법을 Encoding이라고 합니다. One-Hot Encoding은 그 중의 하나입니다. 이것은 구별해야 대상마다 인덱스를 부여하는 방식으로 Encoding을 합니다.

예를 들어 사과, 나무, 배를 구분해야 하는 상황입니다. 이때 이 단어들을 One-Hot Encoding을 통해서 숫자로 바꾸면 [1,0,0], [0,1,0], [0,0,1]로 나타낼 수 있습니다.

FCN(Fully Connected Network)

개요

지금까지 설명한 신경망 구조를 FCN이라고 합니다. 즉, 모든 뉴런들이 연결되어 있는 형태의 신경망 구조를 나타냅니다. FCN은 클래스 분류에 사용되는 신경망입니다. 주요한 특징으로는 분류해야 할 클래스가 여러 개인 경우네는 output layer의 활성화 함수로 soft max를 사용한다는 점입니다.

이미지 데이터의 입력

이미지 데이터는 픽셀 단위로 이루어져 있습니다. 그리고 이미지 데이터가 컬러라면, 한 픽셀에는 rgb값에 해당하는 3개의 데이터가 존재합니다. 이러한 데이터는 벡터로서 존재합니다. 그리고 이 벡터들이 모여서 3차원 행렬로서 이미지 데이터를 표현하게 됩니다. 그리고 신경망에 이미지 데이터를 입력하기 위해서 3차원의 데이터를 1차원의 형태로 변형시켜줍니다.

문제점

FCN의 문제점은 이미지 데이터를 입력하게 되면 이 이미지 데이터의 형상이 무시됩니다. 즉, 2~3차원 이미지 데이터를 처리하는 경우 본질적인 패턴이 무시되어 인식률이 저하됩니다.

CNN(Convolutional Neural Network)

개요

FCN에서 데이터 형상이 무너지는 것의 해결책으로 제시되는 신경망입니다. 2~3차원의 데이터를 학습하기에 적합한 신경망입니다.

구조

위와 같은 구조로 CNN은 이루어져 있습니다. 이미지는 동일하게 3차원 행렬로 나타납니다. 그리고 이 원본 이미지를 필터라는 또 다른 행렬을 이용해서 피쳐맵으로 만들어냅니다. 그리하여 필터 하나당 하나의 피쳐맵을 만들게 됩니다. 그리고 피쳐맵(Feature map)은 이름 그대로 데이터의 특징(Feature)을 나타냅니다. 그리고 마지막에는 클래스 분류를 하기 위해 FCN을 붙입니다. 즉, CNN으로 부터 추출된 이미지의 특징을 이용하여 보다 더 효과적으로 이미지의 클래스를 분류할 수 있는 것입니다.

주의할 점은 컨볼루션 연산 뒤에는 활성화 함수(RELU)를 끼워 넣어줘야 합니다.

CNN = convolutional layer + pooling layer + fully connected layer

Convolution의 의미

딥러닝 관점

필터를 통해서 이미지의 특징을 추출하는 것을 말합니다.

수학적 관점

두 함수 중 하나를 반전, 이동시켜가며 나머지 함수와의 곱을 연이어 적분함을 뜻합니다. 솔직히 잘 모르겠습니다 이 부분은.

Convolution 연산

Convolution Layer에서 convolution 연산을 처리합니다. 이 연산은 필터를 일정간격으로 이동해 가면서 입력 데이터와 대응 원소간 곱셈을 실행한 후 총합을 구하는 것을 뜻합니다. 이때 참고로 필터도 2차원 행렬입니다. 그리고 convolution 연산을 실행하는 것을 convolve 한다라고 합니다.

Pooling 연산

학습 연산량을 줄이기 위해선 피쳐맵의 크기를 줄일 필요가 있습니다. 피쳐맵 크기를 가로 세로 방향으로 축소하는 과정을 pooling 또는 sub sampling이라고 합니다. 주의할 점은 Pooling 연산은 Convolution 연산이 아니라는 것입니다.

Max Pooling


크기를 줄이기 위해 해당 영역의 원소들을 모두 더해줌으로써 피쳐맵의 크기를 줄여주는 방법입니다.

Average Pooling

Max Pooling과 비슷한 방식으로 지정된 영역의 평균을 구해줌으로써 피쳐맵의 크기를 줄여주는 방법입니다.

Pooling 계층의 장점 및 특징

  1. 피쳐맵 크기가 줄어들었기 때문에 연산량을 줄일 수 있다.
  2. 입력 데이터가 조금 변하더라도 풀링의 결과는 잘 변하지 않는다. 따라서 오버피팅 방지 효과가 있다.

Padding

Padding이란?

컨볼루션 연산을 하기 전에 입력 데이터 주변을 특정값으로 채우는데 이 값을 패딩이라고 합니다.

Padding의 필요성

출력 크기를 조절할 때 사용합니다. 즉, 필터를 통해서 원본 데이터를 계속해서 컨볼루션 연산을 하면 어느 순간 데이터의 크기가 1이 되어버립니다. 이런 경우를 방지하기 위해서 패딩값을 사용합니다. 패딩을 통해서 출력 크기가 줄어드는 것을 막을 수 있습니다.

Stride

필터가 이동하는 간격을 stride라고 합니다. 스트라이드 값을 크게 할수록 출력 크기는 더 작아집니다.

Overfitting

Overfitting이란?

오버피팅(과적합)은 필요 이상으로 학습이 진행되어서 오히려 Loss값이 상승한 경우를 말합니다.

Overfitting 방지 방법

Regularization

가중치 값이 너무 커지지 않도록 조정하는 방법입니다.

Dropout

FCN의 경우에 랜덤하게 레이어에 있는 뉴런을 학습 과정에서 탈락시키는 방법을 말합니다.

Custom Dataset을 만들어 본 후기

커스텀 데이터셋을 만들어보았다. Object Detection을 하기 위해서 책과, 마우스의 사진을 찍어서 데이터셋을 형성했다. 여기서 인상 깊었던 점은 사진이 찍힌 특정 각도에서만 인식률이 높아진다는 점이다. 그리고 각도가 달라질수록 인식률은 낮아진다. 그럼에도 불구하고 object detection에서 클래스 분류가 되긴 했다. 또한 opencv-python을 통해서 각도 회전, 대칭을 통해서 데이터셋을 증분시켰다. 여기서 한 가지 의문점은 대칭을 하게 되면 카메라가 인식할 일이 없는 반전된 이미지가 데이터셋에 포함된다. 근데 이것이 과연 인식률에 좋은 영향을 미칠지는 모르겠다. 위와 같이 인식률이 데이터셋에 포함된 사진들이 찍힌 각도와 같은 것에 민감하게 반응하기 때문에 데이터셋을 만들 때는 데이터셋의 생성 목적을 반드시 고려해야 한다. 그래야만 데이터셋에 꼭 포함되어야할 각도라든지 그런 것들을 처리할 수 있다.
그리고 라벨링 작업을 할 때, 이것을 프로그램을 통해서 처리하려고 했는데 yolov4는 반드시 데이터의 변과 평행한 직사각형만을 라벨링으로 받아들인다. 그래서 처음 의도였던, 직사각형을 회전해서 오토라벨링 하는 것은 할 수 없었다. 그래서 알아보니, 회전된 직사각형을 고려하여 새로운 직사각형 라벨링을 만들어주는 오픈 소스가 존재하였다. 아래의 그림처럼 새로운 이미지의 라벨링을 만들어 주면 된다.

https://usmanr149.github.io/urmlblog/yolo/2020/03/05/rotate_yolo_bbox.html

틀린 점이 있다면 언제든 지적 부탁드립니다.

profile
Try again, Fail again, Fail better

0개의 댓글