일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 |
- 백준11404번
- 코틀린
- DP
- mipmap
- 플로이드 워셜
- 생명주기
- 컴퓨터과학
- 액티비티
- 코틀린인액션
- Kotlin-In-Action
- 알고리즘
- CustomView
- 패스트캠퍼스
- 안드로이드
- 데이터베이스
- 우테코 프리코스
- 코틀린 코딩 컨벤션
- 해상도
- 최단경로
- 브로드캐스트 리시버
- 이것이코딩테스트다
- 매니페스트
- 인텐트
- 백준1753번
- 람다식 인라인
- 커스텀뷰
- 다익스트라
- 콘텐츠 프로바이더
- Drawable
- lifecycle
- Today
- Total
생각정리
인공지능 - 신경망 본문
이전까지 공부했던 내용에서 가중치는 인간인 저희가 직접 정해줬습니다. 하지만, 이번에 공부할 신경망의 성질 중 하나는 가중치 매개변수의 값을 데이터로부터 자동으로 학습하는 능력입니다.
지금은 일단 신경망이 무엇인지 먼저 알아보는 단계를 갖겠습니다.
신경망이란? 퍼셉트론과 유사하지만 차이점이 존재함. 우선, 신경망은 입력층-은닉층-출력층 의 구조로 되어있음.
(뉴런이 연결되는 방식은 퍼셉트론과 다르지 않음)
우리가 맨 처음에 배웠던 퍼셉트론은 아래와 같지만, 여기에서는 우리가 두번째로 배운 퍼셉트론에서의 편향b가 보이지 않습니다.
편향의 개념을 도입한 퍼셉트론에서는 편향b도 y출력값에 영향을 주기 때문에 아래 그림과 같이 그려야 논리상 맞습니다.
=> 위 그림에서 가중치 b의 값을 갖고 항상 입력신호 1을 갖는 뉴런이 입력층에 추가된 것을 확인 가능합니다.
즉, x1,x2,1 이라는 입력 신호 3개가 뉴런에 입력되어서 각 신호에 가중치(w1,w2,b)를 곱해서 모두 더한 값이 0을 넘는지 판단해서 출력값 y를 결정한다고 생각할 수 있습니다.
그리고 이걸 다시 한번 생각해보면, 입력신호로 얻은 값들과 각 가중치를 곱한 값의 총 합을 기준으로 출력신호값을 판단하는 부분을 함수화시킬 수 있습니다. 이 함수를 h()라고 해봅시다. (이걸 활성화 함수라고 부릅니다. 뉴런을 활성화 시킬지 판단하는 함수라는 의미입니다.)
그러면 위 그림을 다음과 같이 생각해볼 수 있습니다.
=> 가중치가 달린 입력 신호와 편향의 총합을 계산한 것을 a라고 하고, 이 a를 활성화 함수 h()에 넣어서 y를 출력함.
(참고: 위 그림에서 a와 y는 각각 다른 뉴런으로 표현된 것을 확인 가능합니다. 신경망의 동작을 더 명확히 드러내고 싶을때, 위의 사진처럼, a와 y 뉴런을 하나의 처리과정을 감싸서, 활성화 함수의 처리과정을 명시하기도 합니다.)
이렇게 활성화 함수의 임계값을 경계로 0과1로 출력이 바뀌는 것을 계단 함수라고 부릅니다. 위 그림에서 활성화 함수 h()는 0을 임계값으로 갖는 것을 확인 가능합니다.
다시 한번 정리해보면, 활성화 함수는 해당 뉴런의 출력값을 정하는 함수라고 생각해 볼 수 있습니다. 퍼셉트론에서는 활성화 함수로 계단 함수를 사용하지만, 신경망에서는 계단 함수 이외의 함수를 활성화 함수로 사용할 수 있습니다. 즉, 풀고자 하는 문제 상황에 맞게 적절한 활성화 함수를 사용하면 됩니다.
( 활성화 함수는 일반적으로 신경망의 은닉층에서 적용됨)
신경망에서 적용 가능한 활성화 함수의 종류 - 소프트맥스(시그모이드 함수), ReLU, 항등 함수 등...
시그모이드 함수
시그모이드 함수는 신경망에서 자주 이용하는 활성화 함수입니다.
여기서 exp(-x)는 e의 -x 승 입니다.
e의 -x승은 좌표평면 상에서 항상 0보다 큰 값을 갖고, x가 작아질수록 무한대에 가까워집니다. 또한 미분을 하면 항상 미분계수가 음수가 나오는 것을 확인 가능합니다.
이런 성질을 가진 exp(-x)가 h(x)의 분모에 존재하므로 x가 작아질수록 h(x)는 분모가 계속 커져서 0에 가까워지고,
x가 커질수록 exp(-x)가 0에 가까워져서 h(x)는 1에 가까워지는 것을 알 수 있습니다.
시그모이드 함수는 계단 함수와는 다르게 0과 1이 아닌 연속적인 실수 값을 가질 수 있습니다. 하지만 위 그림을 보면 알 수 있듯이 두 함수의 전체적인 기조는 비슷합니다. x가 커지면 h(x)도 커지면서 1에 가까워지고, x가 작아지면 h(x)도 0에 가까워집니다.
두 함수의 공통점으로는 두 함수 모두 비선형 함수라는 것입니다. 신경망에서는 활성화 함수로 비선형 함수를 활용합니다.
왜 비선형 함수를 사용해야할까? 선형함수를 이용하면, 신경망의 층을 깊게하는 의미가 없어지기 때문입니다. 즉, 층을 아무리 깊게 해도 은닉층의 내부를 수식으로 파악 가능해짐. 예를 들어 활성화함수로 cx라는 선형함수를 사용한다면, 은닉층이 아무리 깊어져봤자 x=c*c*c*c....*c*x 이고, 이는 곧 ax와 같습니다. 이렇게 되면 최종 출력층의 입력신호로 ax의 값이 들어가게 되기 때문에 은닉층이 의미 없어집니다.
ReLU함수 (=렐루 함수)
최근에 활성화 함수로 자주 이용하는 함수입니다.
렐루 함수는 입력이 0을 넘으면, 그 입력을 그대로 출력하고 0이하이면 0을 출력하는 함수입니다.
신경망에서 가중치 표기방법
x2에서 다음 층의 첫번째 뉴런으로 가는데 필요한 가중치를 표현하는데, 위와 같이 표현합니다. 신경망은 0층부터 시작한다는 것을 기억하면 이해하는데 도움 될 것이라고 생각합니다.
이런 구조의 흐름을 따라가다보면 다음과 같은 공식을 유도할 수 있습니다.
=> A=X*W + B 라는 공식으로 활성화 함수에 인자로 들어갈 A를 구할 수있음.
즉, 먼저 선형적인 행렬 곱이 수행되어야 그 결과를 토대로 비선형적인 활성화 함수를 수행 가능함.
이런 구조로 2층을 비롯한 모든 은닉층을 동일하게 해주면 된다. 하지만 유일하게 출력 층에만 은닉층과 적용시키는 활성화함수가 다르다.
출력층의 활성화 함수는 은닉층의 활성화 함수인 h()와는 다르게 시그마()라고 표기합니다.
출력층의 활성화 함수는 풀고자 하는 문제에 맞게 적절히 선택해주면 되는데, 예를 들어 회귀에는 항등 함수를,
클래스가 2개인 분류에는 시그모이드 함수를,
다중 클래스 분류에는 소프트맥스 함수를 사용하는 것이 일반적입니다.
소프트맥스 함수란?
소프트 맥스 함수의 수식을 보면 알겠지만, 출력층의 뉴런 한개의 결과를 계산하기 위해서 모든 입력신호의 합을 사용하고 있는 것을 알 수 있다. 따라서 소프트 맥스 함수는 위 그림처럼, 출력층의 각 뉴런이 모든 입력 신호에 영향을 주는걸로 표현된다. n은 출력층의 뉴런 수이고, exp(x)는 e의 x승인 것을 생각하고 수식을 읽어보면 이해할 수 있을 것이라고 생각합니다. 예시를 한개 들어보면, y1은 (e의 a1승) / (입력신호의 총합) 이 됩니다.
소프트맥스함수를 파이썬 코드로 구현하면 다음과 같습니다.
하지만, 위의 수식을 구현한 소프트맥스 함수는 단점이 있습니다.
바로 np.exp() 함수에서 오버플로우가 발생 가능하다는 것입니다.
그래서 다음과 같은 단점을 보완하기 위해서는 위에서 봤던 소프트맥스 함수 수식을 수정할 필요가 있습니다.
여기서 새롭게 추가된 C'은 상수이며, 일반적으로 오버플로우를 막기 위한 목적으로 사용할때는 입력 신호 중 최댓값을 활용함. 입력신호의 최댓값으로 모든 입력신호 원소를 빼는 등 적절히 조절해서 사용할 수 있습니다.
위와 같이 파이썬 함수가 수정될 수 있습니다.
소프트맥스 함수의 특징)
기본 수식을 보면 알 수 있듯이, 소프트 맥스 함수의 출력은 0~1.0 사이의 실수임. (exp()지수함수는 무조건 0보다 크므로)
또, 소프트맥스 함수를 거쳐서 나오는 출력의 총합은 1임.
=> 이런 성질 덕분에 소프트맥스 함수의 출력을 확률로 해석 가능함. 그리고 출력 중 가장 확률이 높은 출력 뉴런을 정답으로 취급할 것입니다. 그래서 소프트 맥스함수가 분류모델에 사용되는 것입니다.
또한, exp() 지수함수는 단조 증가 함수이므로, 입력이 크면 출력도 커짐. 즉, 소프트 맥스함수로부터 나온 출력결과 중 가장 큰 값을 가진 뉴런과 대응되는 위치에 있는 입력층의 뉴런으로부터 들어온 입력신호가 입력신호들 중 제일 컸다는 것을 의미합니다. => 그래서 실제로 소프트맥스 함수를 출력층의 활성화 함수로 사용하려고 할때는 소프트맥스 함수 호출을 생략합니다. (입력신호 값만 보고도 가장 큰 출력 신호를 갖는 뉴런을 찾을 수 있어서)
다음 시간에는 손글씨 숫자 인식의 추론과정을 구현해보도록 하겠습니다.
(기계학습과 신경망은 학습과 추론의 두 단계로 구성됨. 학습할 데이터로부터 가중치 배개변수를 학습하고, 추론단계에서는 학습한 매개변수를 활용해서 입력데이터를 분류함)
읽어주셔서 감사합니다.
위 글에서 문제가 있을시 댓글 남겨주시면 빠르게 조치하겠습니다. 감사합니다.
참고자료)
밑바닥부터 시작하는 딥러닝-사이토고키,한빛미디어
'인공지능' 카테고리의 다른 글
신경망 학습 (0) | 2022.09.28 |
---|---|
인공지능-퍼셉트론을 파이썬으로 구현해보고 다층 퍼셉트론 공부하기 (0) | 2022.09.23 |
인공지능-퍼셉트론 모델 (2) | 2022.09.23 |