SlideShare a Scribd company logo
1 of 134
Download to read offline
파이썬으로 익히는 딥러닝 기본
(Python Deep Learning Basic)
2018. 7.
강병호수석
I. 머신러닝 개요
II. 퍼셉트론의 이해
III. 신경망의 순전파
IV. 신경망의 학습
V. 신경망의 역전파
VI. 학습 관련 기술
Contents
작성자 소개
 학력
• 1993년 숭실대학교 인공지능학과 입학
• 2000년 숭실대학교 컴퓨터학부 졸업
 경력
• 2000년 SKC&C (현, SK주식회사) 입사 ~
• 국내 프로젝트 수행
• 2000년 ~ 2003년 SK Telecom Web Development
• 2010년 ~ 2014년 SK Telecom Web Development
• 2017년 ~ 2018년 인공지능 프로젝트
• 해외 프로젝트 수행
• 2003년 ~ 2004년 베트남 S Telecom 영업시스템
• 2005년 ~ 2009년 미국 Virgin Mobile USA 영업시스템
• 2009년 ~ 2010년 미국 Union Back 모바일 프로젝트
• 2015년 ~ 2016년 중국 SKC&C 중국법인 역량개발 총괄
 기타
• 회사 사내 강사 (2012년~)
• 자바, 스프링, 웹 개발, 인공지능 강의 수행
• 국가 자격증 문제 출제 위원 (Pilot, 2014년)
• 한국소프트웨어기술협회(KOSTA) SW개발자 L4 자격
강병호 수석
medit74@sk.com
주요 참고 문헌
I. 머신러닝 개요
머신러닝의 정의 머신러닝 개요
Arthur Samuel은 1959년 처음으로 Machine Learning이라는 용어를 사용하였다.
 Arthur Samuel (1959)
명시적으로 프로그램을 작성하지 않고 컴퓨터에 학습할 수 있는 능력을 부여하기 위한 연구 분야
“The field of study that gives computers the ability to learn without being explicitly programmed”
 Machine Learning의 예 (y=3x)
• 학습데이터 (1,3), (3,9), (4,12), (6,18)
• 컴퓨터에 y=3x의 함수를 프로그래밍하지 않아도 앞의 학습데이터를 학습한 후 (8, ?) (10, ?)의 질문을 던져도
그 대답을 할 수 있게 만드는 것.
머신러닝, 데이터 마이닝과 무엇이 다를까?
분류, 예측, 군집 같은
기술, 모델, 알고리즘을
이용
데이터의 몰랐던
속성 발견에 집중
학습데이터 기반
예측에 집중
Machine Learning Data Mining
머신러닝의 정의 머신러닝 개요
Tom Mitchell은 1997년에 Machine Learning에 대해 재 정의를 하였다.
 Tom Mitchell (Carnegie Mellon University, 1997)
만약 컴퓨터 프로그램이 특정한 태스크 T를 수행할 때 성능 P만큼 개선되는 경험 E를 보이면, 그 컴퓨터 프로그램은 태
스크 T와 성능 P에 대해 경험 E를 학습했다라고 할 수 있다.
"A computer program is said to learn from experience E with respect to some class of tasks T and performance
measure P, if its performance at tasks in T, as measured by P, improves with experience E."
 문제) Suppose your email program watches which emails you do or do not mark as spam, and based on
that learns how to better filter spam. What is the task T in this setting?
① Classifying emails as spam or not spam.
② Watching you label emails as spam or not spam.
③ The number (or fraction) of emails correctly classified as spam/not spam.
T
E
P
머신러닝의 정의 머신러닝 개요
구글의 Yufeng은 2017년 Machine Learning를 심플하게 정의하였다.
 “Using data to answer questions”
 Data is the Key
[From] https://towardsdatascience.com/what-is-machine-learning-8c6871016736
머신러닝의 정의 머신러닝 개요
순서나 이유를 명확하게 설명하지 못하는 일을 처리하기 위한 방법으로 기계 학습을 선택할 수 있다.
【 순차적 처리】 【 기계 학습 】
 월별 매출 집계
 종업원 개인 정보 관리
 상품 재고 관리
Data
Program
처리 결과 Data
학습모델
처리 결과
 앞에 있는 과일을 보고 사과라고 인식한다.
 오늘은 상대의 기분이 안 좋아 보인다.
 한눈에 반해서 사랑에 빠진다.
 Training Set
Machine Learning이 학습 모델을 만들기 위해 사용하는 데이터
 Model
Machine Learning에서 구하려는 최종 결과물로 가설(Hypothesis)이라고도 부른다.
 Inference / Prediction
학습된 모델을 실제 현장에서 사용하는 과정
머신러닝의 분류 머신러닝 개요
학습 데이터에 레이블(label)이 있는 경우와 그렇지 않은 경우에 따라 지도학습과 비지도학습으로 구분하고, 강화학습은 지도학
습 중 하나로 분류되거나 또는 독립적인 세 번째 머신러닝 모델로 분류하기도 한다.
Types Tasks Algorithms
지도학습
(Supervised Learning)
분류
(Classification)
 KNN : k Nearest Neighbor
 SVM : Support Vector Machine
 Decision Tree (의사결정 나무)
 Logistic Regression
예측
(Prediction)
 Linear Regression (선형 회귀)
비지도학습
(Unsupervised Learning)
군집
(Clustering)
 K-Means Clustering
 DBSCAN Clustering
 Hierarchical Clustering (계층형 군집)
강화학습
(Reinforcement Learning)
 MDP : Markov Decision Process
 DQN : Deep Q-Network
기계 학습 시 고려해야 할 사항은?
 그 방법으로 문제를 풀 수 있는가?
 그 방법을 적용할 경우 성능에 문제가 없는가?
 그 방법을 적용하기 위해 데이터를 충분히 준비할 수 있는가?
머신러닝 개요
지도학습 : Label이 있는 학습 데이터(Training Set)를 이용해서 학습.
【 지도학습의 Training Set의 예】
분류 (Classification) 회귀 (Regression)
결과 학습데이터의 레이블 중 하
나를 예측 (discrete)
연속된 값을 예측
(Continuous)
예제 학습데이터가 A, B, C 인 경
우 결과는 A, B, C 중 하나다.
예) 스팸메일 필터
결과 값이 어떠한 값도 나올
수 있다.
예) 주가 분석 예측
 분류와 회귀의 비교
머신러닝의 분류
머신러닝 개요
비지도학습 : Label이 없는 학습 데이터(Training Set)를 이용해서 학습.
【 비지도학습의 Training Set의 예】
분류 (Classification) 군집 (Clustering)
공통점 입력된 데이터들이 어떤 형태로 그룹을 형성하는지가 관
심사
차이점 레이블이 있다. 레이블이 없다.
예) 의학 임상실험 환자군 구별
예) 구매자 유형 분류
 분류와 군집의 비교
머신러닝의 분류
머신러닝 개요
강화학습 : 상과 벌이라는 보상을 통해 현재의 행위의 그 방향 혹은 반대 방향으로 행위를 강화화는 학습 방향
 강화학습
 시행착오 과정을 거쳐 학습하기 때문에 사람의 학습방식과 유사
 Agent는 환경으로부터 상태를 관측하고 이에 따른 적절한 행동을 하
면 이 행동을 기준으로 환경으로부터 보상을 받는다.
 관측 – 행동 – 보상의 상호작용을 반복하면서 환경으로부터 얻는 보상
을 최대화하는 태스크를 수행하기 위한 일련의 과정.
 관측 – 행동 – 보상의 과정을 경험(Experience)이라고도 한다.
머신러닝의 분류
 문제 : Wine or Beer?
 다양한 Feature 들 중에 2개의 Feature로만 Wine과 Beer를 구분하는 문제
 색 (빛의 파장) 및 알코올 함유량 (%)
머신러닝 개요
머신러닝 어플리케이션은 일련의 단계가 반복적인 프로세스를 통해서 구현된다.
머신러닝의 구현
Gathering data
Data prepa
ration
Choosing a
model
Training Evaluation
Parameter
tuning
Prediction
[From] https://towardsdatascience.com/the-7-steps-of-machine-learning-2877d7e5548e
머신러닝 개요
Gathering Data는 Training Data를 확보하는 것이다.
머신러닝의 구현
* nm : nanometer
Gathering data
Data prepa
ration
Choosing a
model
Training Evaluation
Parameter
tuning
Prediction
머신러닝 개요
Data Preparation은 Training Data를 적절한 곳에 적재하고 준비하는 것이다.
머신러닝의 구현
Gathering data
Data prep
aration
Choosing a
model
Training Evaluation
Parameter
tuning
Prediction
 모든 Training Data를 합쳐 순서를 섞는다.
 Training Data는 편향되지 않아야 한다.
 학습 데이터가 나쁘면 실제 현장의 특성을 제대로 반영하지 못하므로,
학습 데이터 확보 시 실제 데이터의 특성이 잘 반영되고 편향되지 않
는 학습 데이터를 확보하는 것이 매우 중요함.
 예) Beer 데이터가 Wine 데이터보다 월등히 많아서는 안된다.
 Data는 적당히 분리하여 준비한다.
 Training Set : 모델을 훈련 시키기 위한 data set
 Validation Set : 모델이 예측할 때 사용하기 위한 data set
 Test Set : 훈련이 끝난 모델을 평가하기 위한 data set
 대부분 문제에서 Data는 조정되어 준비될 필요가 있다.
 Normalization
 Error Correction
 Image Adjusting and Manipulation
 모델의 선택
 머신러닝 알고리즘, 딥러닝 알고리즘, 강화학습 알고리즘
 이미지에 적합한 모델
 텍스트나 음성같은 시계열 데이터에 적합한 모델
 Wine or Beer 문제는 이진 분류 문제 임으로 Logistic Regression Model 이 적합
머신러닝 개요
이미 수년간 머신러닝 전문가에 의해 만들어진 모델에서 적합한 모델을 선택한다.
머신러닝의 구현
Gathering data
Data prepa
ration
Choosing
a model
Training Evaluation
Parameter
tuning
Prediction
머신러닝 개요
반복적인 Training을 통해 모델의 성능을 향상시킨다.
머신러닝의 구현
Gathering data
Data prepa
ration
Choosing a
model
Training Evaluation
Parameter
tuning
Prediction
 Training
 Use our data to incrementally improve our model’s
ability to predict whether a given drink is wine or beer.
 훈련용 데이터를 이용해 모델을 학습하고, 학습된 모델을
예측용 데이터를 이용해 테스트한 후, 발생한 오차를 모델
에 반영.
 위 과정을 상당히 반복하여 최적의 모델을 만드는 것을 목
표로 함.
 Evaluation
 별도로 분리된 Evaluation 용 data set을 활용하여 훈련이 끝난 모델을 평가
 일반적으로 평가용으로 활용되는 data set을 훈련용으로 사용하지는 않는다.
머신러닝 개요
학습이 끝난 모델을 평가하여 모델이 잘 완성되었는 지 평가
머신러닝의 구현
Gathering data
Data prepa
ration
Choosing a
model
Training Evaluation
Parameter
tuning
Prediction
 Parameter Tuning
 더 좋은 모델을 만들고, 더 효율적이 학습을 하기 위해 학습 시 활용되는 Parameter의 값을 조정한다.
 얼마나 많이 학습 시킬 것인가?
 한 번 학습 시 마다 발생하 오류를 어느 정도로 반영할 것인가? (“learning rate”)
 모델의 초기값을 어떻게 설정할 것인가?
 이렇게 사람이 조정하는 파라미터를 “hyperparameters”라고 함.
머신러닝 개요
좀 더 나은 학습을 위하여 파라미터를 조정한다.
머신러닝의 구현
Gathering data
Data prepa
ration
Choosing a
model
Training Evaluation
Parameter
tuning
Prediction
 Inference / Prediction
머신러닝 개요
완성된 모델을 활용하여 추론(예측)한다.
머신러닝의 구현
Gathering data
Data prepa
ration
Choosing a
model
Training Evaluation
Parameter
tuning
Prediction
딥러닝 개요 머신러닝 개요
Deep Learning은 Machine Learning의 일종이고, Machine Learning은 인공지능의 일종이다.
딥러닝 개요
딥러닝이란 컴퓨터가 스스로 학습할 수 있게 하기 위해 인공 신경망을 기반으로 하는 기계 학습 기술
 딥러닝이란?
인간의 신경망(Neural Network) 이론을 이용한 인공 신경망 (ANN, Artificial Neural Network)의 일종으로, 계층 구조
(Layer Structure)로 구성되면서 입력층(Input Layer)과 출력층(Output Layer) 사이에 하나 이상의 은닉층(Hidden
Layer)을 가지고 있는 심층 신경망(DNN, Deep Neural Network) 이다.
머신러닝 개요
인공신경망(ANN)은 인간의 뇌 구조를 모방하여 모델링 한 수학적 모델이다.
 신경세포 (Neuron, 뉴런)
Neuron의 입력은 다수이고 출력은 하나이며, 여러 신경세포로부터 전달되어 온 신호들은 합산되어 출력된다.
합산된 값이 설정 값(Threshold) 이상이면 출력 신호가 생기고 이하이면 출력 신호가 없다.
생물 신경망 인공 신경망
세포체 (Cell Body) 노드 (Node)
수상돌기 (Dendrites) 입력 (Input)
축삭 (Axon) 출력 (Output)
 연결 : Synapse - Weight
다수의 Neuron이 연결되어 의미 있는 작업을 하듯, 인공신경망의 경우도 노드들을 연결시켜 Layer를 만들고 연결 강
도는 가중치로 처리된다.
생물 신경망 인공 신경망
Synapse 가중치 (Weight)
딥러닝 개요 머신러닝 개요
딥러닝의 근간이 되는 시작된 인공신경망의 연구는 1950년대부터 시작되었다.
Perceptron(1958)
1960 1970 1980 1990 2000
역전파 이론 (‘1981, ‘1986)
• 폴 워보스가 74년에 적용, 81년에 발표
• 러멜하트, 제프리힌톤, 로날드윌리엄스가
역전파 학습모델 발표 (‘1986)
 인공신경망 연구 활성화
다층 퍼셉트론 출현 (‘1968)
네오코그니트론(neocognitron) 모델 (‘1979)
• 후쿠시마 쿠니히코가 발표 (일본)
• 뇌가 시작정보를 처리하는 구조를 기반으로 모델 작성
• 현재 Convolution 신경망(CNN)과 매우 유사
순환신경망 (RNN, Recurrent Neural Network, ‘1992)
• 장단기 기억법 (Long Short-Term Memory) 개발 (‘1991)
: 출력증의 정보를 계속 메모리에 저장하여 역전파에 이용
• 순환신경망 개발 (‘1992) : 장단기 기억법을 개선
: 후에 심층신뢰망 (DBN, Deep Belief Network)에 영향
딥러닝 용어 등장 (‘2000)
손글씨 문자 인식 연구 (‘1998)
• CNN을 활용하여 높은 정밀도의
손글씨 문자 인식 (LeCun 팀)
딥러닝 개요 머신러닝 개요
2000년대 초 빙하기를 거치지만 2006년 부터 딥러닝 문제가 해결되면서 딥러닝이 부활되었다.
2000 2010 2020
딥러닝 부활 (‘2006)
• 심층신뢰망 (DBN)
 제프리 힌튼, 사이먼 오신데로, 이-화이테가 심층신뢰망 발표
 RBM(Restricted Boltzmann Machine)이라는 사전학습(Pre-Training) 이용
• Auto-Encoder
 벤지오 팀이 발표, DNN을 최적화하는 사전학습(Pre-Training) 방법
 사전 학습을 통해 가중치 초깃값을 정하면 DNN이라도 학습이 잘 됨
Dropout 알고리즘 (‘2012)
• Dropout 알고리즘 : 학습 시 오버피팅(overfitting)을 줄임
• Sigmoid 형 함수 대신 ReLU 형 함수 사용
GPU를 이용한 연산
풍부한 데이터
오픈 소스 개발 프레임워크
최근
DNN 최적화 어려움
엄청난 계산량
머신러닝알고리즘 발전
딥러닝 빙하기 (2000~2005)
 Deep Learning은 왜 주목 받는가?
Difficulties 해결 방안
학습 DNN 학습이 잘 안 됨. Unsupervised Pre-Training를 통한 해결
계산량 학습이 많은 계산이 필요함 H/W의 발전 및 GPU 활용
성능 다른 Machine Learning Algorithm의 높은 성
능
Dropout 알고리즘 등으로 Machine Learning 대비 월등한 성능
딥러닝 개요 머신러닝 개요
II. 퍼셉트론의 이해
1943년 워렌 맥컬록(McCulloch)과 월터 피츠(Pitts)는 생물학적 신경망 이론을 단순화 해서 최초로 인공신경망 이론을 제시.
 TLU : 최초의 인공신경망
최초의 인공신경망은 생물학적 신경망을 단순화 해서 논리, 산술,
기호 연산을 구현할 수 있게 하였는데 이것을 TLU (Threshold
Logic Unit)라고 정의했다.
𝒙 𝟏
𝒙 𝟐
Σ 𝜃 = 2
𝒚
McCulloch-Pitts 논문에 표현된 TLU
 TLU를 AND 논리 연산에 적용한 예
입력 x1 입력 x2 출력 y
0 0 0
0 1 0
1 0 0
1 1 1
만약 𝜃=1이면 OR 연산이 적용된 TLU가 된다.
퍼셉트론이란? 퍼셉트론의 이해
1949년 Donald Hebb은 시냅스의 연결강도 조정을 위한 생리학적 학습 규칙을 모델링하여 가중치 개념을 도입
퍼셉트론이란? 퍼셉트론의 이해
 헵의 학습 (Hebbian Learning)
 생물학적 신경망에서 뉴런 사이에서 신호전달 시 반복적 또는 지속적으로 신호가 자극됨.
이 결과로 뉴런 A에서 뉴런 B로 가는 경로인 시냅스 연결이 강화된다.
 Hebb은 이것이 신경 레벨의 일종의 학습/기억의 과정이라고 보고 인공신경망에 가중치 개념으로 도입했다.
퍼셉트론이란? 퍼셉트론의 이해
1957년 로젠블래트는 현재 딥러닝의 기원이 되는 퍼셉트론 이론을 발표함.
 Perceptron 이란?
 McCulloch-Pitts TLU 이론 + Hebb의 학습 이론을 기반으로 입력층과 출력층 만으로 구성되는 알고리즘
 퍼셉트론은 다수의 신호를 입력으로 받아 하나의 신호로 출력
 출력은 1과 0의 두 가지 값만 가질 수 있다.
퍼셉트론이란? 퍼셉트론의 이해
퍼셉트론의 동작원리를 수식으로 표현
 입력으로 2개의 신호를 받는 퍼셉트론의 수식화
𝑦 =
0 (𝑤1 𝑥1 + 𝑤2 𝑥2 ≤ 𝜃)
1 (𝑤1 𝑥1 + 𝑤2 𝑥2 > 𝜃)
𝒙 𝟏
𝒙 𝟐
Σ 𝜃
𝒚
𝒘 𝟏
𝒘 𝟐
퍼셉트론의 구현 퍼셉트론의 이해
파이썬으로 입력층이 2개인 퍼셉트론을 구현
 퍼셉트론을 함수로 구현
def perceptron(x1, x2, w1, w2, theta):
affine = x1*w1 + x2*w2
if affine > theta:
return 1
elif affine <= theta:
return 0
𝑦 =
0 (𝑤1 𝑥1 + 𝑤2 𝑥2 ≤ 𝜃)
1 (𝑤1 𝑥1 + 𝑤2 𝑥2 > 𝜃)
퍼셉트론의 구현 퍼셉트론의 이해
AND 게이트와 OR 게이트로 동작하는 퍼셉트론
 AND / OR 논리회로 진리표 (Truth-table)
입력 출력 (𝒚)
𝒙 𝟏 𝒙 𝟐 AND OR
0 0 0 0
1 0 0 1
0 1 0 1
1 1 1 1
𝒘 𝟏 𝒘 𝟐 𝜽
AND 0.5 0.5 0.7
AND 0.3 0.7 0.9
AND 1.0 1.0 1.1
OR 0.5 0.5 0.2
OR 0.8 0.4 0.3
OR 1.2 1.2 1.0
 가중치와 임계 값을 조정하여 AND 퍼셉트론과 OR 퍼셉트론을 표현
 이 예제에서 가중치와 임계 값은 사람이 임의로 지정.
 기계학습은 이 값을 정하는 작업을 컴퓨터가 자동으로
하도록 하는 것.
 즉, 신경망에서 학습이란 컴퓨터가 가중치를 정하는 것
이며, 사람은 망의 구조(모델)을 고민하고 학습 데이터
를 주는 일을 하는 것이다.
 적당한 가중치를 알아내는 학습이 필요함
𝒙 𝟏
𝒙 𝟐
Σ 𝜃
𝒚
𝒘 𝟏
𝒘 𝟐
퍼셉트론의 구현 퍼셉트론의 이해
AND 게이트와 OR 게이트로 동작하는 퍼셉트론을 구현
 AND 퍼셉트론과 OR 퍼셉트론을 함수로 구현
def perceptron(x1, x2, w1, w2, theta):
affine = x1*w1 + x2*w2
if affine > theta:
return 1
elif affine <= theta:
return 0
def andPerceptron(x1, x2):
w1, w2, theta = 0.5, 0.5, 0.7
return perceptron(x1, x2, w1, w2, theta)
def orPerceptron(x1, x2):
w1, w2, theta = 0.5, 0.5, 0.2
return perceptron(x1, x2, w1, w2, theta);
print(andPerceptron(0,0))
print(andPerceptron(0,1))
print(andPerceptron(1,0))
print(andPerceptron(1,1))
print(orPerceptron(0,0))
print(orPerceptron(0,1))
print(orPerceptron(1,0))
print(orPerceptron(1,1))
𝑦 =
0 (𝑤1 𝑥1 + 𝑤2 𝑥2 ≤ 𝜃)
1 (𝑤1 𝑥1 + 𝑤2 𝑥2 > 𝜃)
퍼셉트론의 구현 퍼셉트론의 이해
Bias (편향)을 도입하여 임계 값을 치환하면 같은 결과를 낼 수 있다. (𝜽를 −𝒃로 대체)
 입력이 2개인 Perceptron (Bias의 도입)
𝑦 =
0 (𝑏 + 𝑤1 𝑥1 + 𝑤2 𝑥2 ≤ 0)
1 (𝑏 + 𝑤1 𝑥1 + 𝑤2 𝑥2 > 0)
𝒙 𝟏
𝒙 𝟐
Σ 𝒚
𝒘 𝟏
𝒘 𝟐
𝒃
 Bias (편향)
• 가중치 (𝒘 𝟏, 𝒘 𝟐)는 각 입력 신호가 결과에 주는 영향력을 조절하는 매개변수이고, Bias는 뉴런(Node)이 얼마나 쉽
게 활성화(여기에서는 결과를 1로 출력)하느냐를 조정하는 매개변수 임.
• Bias의 사전적 의미로는 ‘한쪽으로 치우쳐 균형을 깬다’라는 의미를 담고 있다.
퍼셉트론의 구현 퍼셉트론의 이해
AND / OR 퍼셉트론에 Bias를 도입하여 NumPy를 이용해서 구현
import numpy as np
def perceptron(X, W, bias):
affine = np.sum(X*W) + bias
if affine > 0:
return 1
elif affine <= 0:
return 0
def andPerceptron(X):
W = np.array([0.5, 0.5])
bias = -0.7
return perceptron(X, W, bias)
def orPerceptron(X):
W = np.array([0.5, 0.5])
bias = -0.2
return perceptron(X, W, bias)
print(andPerceptron(np.array([0,0])))
print(andPerceptron(np.array([0,1])))
print(andPerceptron(np.array([1,0])))
print(andPerceptron(np.array([1,1])))
print(orPerceptron(np.array([0,0])))
print(orPerceptron(np.array([0,1])))
print(orPerceptron(np.array([1,0])))
print(orPerceptron(np.array([1,1])))
 NumPy를 이용한 Perceptron
• 입력값과 가중치를 NumPy 1차원 배열 (ndarray) 로 표현
• ndarray의 산술 연산, 유니버설 함수를 이용해 입력 값과 가중치 연산을 단순화
• Bias 를 고려하여 And / Or 퍼셉트론을 구현
𝑦 =
0 (𝑏 + 𝑤1 𝑥1 + 𝑤2 𝑥2 ≤ 0)
1 (𝑏 + 𝑤1 𝑥1 + 𝑤2 𝑥2 > 0)
퍼셉트론의 구현 퍼셉트론의 이해
퍼셉트론의 시각화
 Perceptron은 선형 분리 문제를 풀 수 있다.
• 퍼셉트론을 시각화하면 직선으로 나뉜 두 영역을 만든다.
• Perceptron은 학습이 진행될수록 선형 분리(linear boundary)선을 업데이트하면서 학습
퍼셉트론의 한계와 극복 퍼셉트론의 이해
XOR 게이트 구현의 한계
 XOR 논리 회로는 퍼셉트론으로 구현할 수 없다.
입력 출력 (𝒚)
𝒙 𝟏 𝒙 𝟐 XOR
0 0 0
1 0 1
0 1 1
1 1 0
 퍼셉트론의 Weight와 Bias의 값을 아무리 조정하더라도 XOR 퍼셉트론은
구현할 수가 없다.
 퍼셉트론은 직선으로 나눈 영역만 표현할 수 있는데, XOR는 직선으로
영역을 나누어 표현할 수가 없다.
 인공지능의 1차 겨울을 초래
퍼셉트론의 한계와 극복 퍼셉트론의 이해
다층 퍼셉트론 (multi layer perceptron)
 XOR 게이트는 퍼셉트론에 은닉층을 하나 추가한 다층 퍼셉트론(2층 퍼셉트론)으로 구현할 수 있다.
입력 x1 입력 x2 은닉층
뉴런#1
은닉층
뉴런#2
y
0 0 0 0 0
0 1 0 1 1
1 0 0 1 1
1 1 1 1 0
[ 은닉층 뉴런#1은 AND연산, 은닉층 뉴런#2는 OR연산, 출력층은 XOR연산이 된다. ]
𝒙 𝟏
𝒙 𝟐
Σ|𝜃=1
𝒚
Σ|𝜃=1
Σ|𝜃=1
𝑤1 = −1.2
𝑤2 = 1.2
𝑤1 = 1.2
𝑤2 = 0.6
𝑤2 = 1.2
𝑤1 = 0.6
은닉층뉴런#1
은닉층뉴런#2
 가중치를 갖는 층이 2개라 2층 퍼셉트론이라 한다.
퍼셉트론의 한계와 극복 퍼셉트론의 이해
은닉층 (Hidden Layer)
 은닉층(Hidden Layer)의 역할
 은닉층은 앞 단계에서 받은 데이터(신호)를 필터링해서 좀 더 구체화 한 후 다음 단계 층으로 전달
 각 은닉층마다 몇 개의 뉴런(노드)이 최적인지는 문제에 따라 다르다.
 Hidden Layer을 추가하면 선형분리 불가능 (linearly inseparable) 문제를 풀 수 있다.
 하지만, 다층 퍼셉트론 발견 상시에는 다층 퍼셉트론을 학습시킬 수학적 모델이 없었다.
 은닉층의 개수가 늘어나면 더욱 복잡한 문제를 풀 수 있으나 컴퓨터 계산량이 늘어난다.
 신경망 층에 따라 Decision Boundary는 더 정확해 진다.
실습 퍼셉트론의 이해
 NAND (Not AND) 퍼셉트론을 구현한다.
• 입력값과 가중치의 연산은 NumPy를 활용한다.
• Bias를 활용한다.
• NAND 진리표는 다음과 같으며, 이를 구현하기 위해 Weight와 Bias를 적절히 초기화 한다.
#1 – NAND 퍼셉트론 구현
입력 출력 (𝒚)
𝒙 𝟏 𝒙 𝟐 NAND
0 0 1
1 0 1
0 1 1
1 1 0
실습 퍼셉트론의 이해
 아래 가중치와 임계 값을 이용하여 XOR 퍼셉트론을 구현한다.
#2 – XOR 다층 퍼셉트론 구현 1
𝒙 𝟏
𝒙 𝟐
Σ|𝜃=1
𝒚
Σ|𝜃=1
Σ|𝜃=1
𝑤1 = −1.2
𝑤2 = 1.2
𝑤1 = 1.2
𝑤2 = 0.6
𝑤2 = 1.2
𝑤1 = 0.6
은닉층뉴런#1
은닉층뉴런#2
실습 퍼셉트론의 이해
#3 – XOR 다층 퍼셉트론 구현 2
 기존 게이트의 조합으로 XOR 퍼셉트론을 구현한다.
• XOR 게이트를 만드는 방법은 다양하다.
• XOR 게이트는 AND, NAND, OR 게이트 조합으로도 만들 수 있다.
• AND, NAND, OR 게이트의 아래와 같은 조합으로 XOR 퍼셉트론을 구현해 본다.
NAND
OR
AND
III. 신경망의 순전파
신경망 신경망의 순전파
신경망의 순전파
 신경망에서 정보의 흐름은 입력층  은닉층  출력증으로 진행되는데 이렇게 정보가 전방으로 전달되는 것을 순전파
(Feed forward)라고 한다
 Input Layer (입력층)
 입력 데이터를 받아들인다.
 입력층의 노드(뉴런) 수는 입력 데이터의 특성 개수와 일치 한다.
 Hidden Layer (은닉층)
 은닉층의 뉴런 수와 은닉층의 개수는 신경망 설계자의 직관과 경험에 의존
 은닉층의 뉴런 수가 너무 많으면 Overfitting이 발생, 너무 적으면 충분히 표현하지 못함.
 은닉충의 개수가 너무 많으면 비효율적
(예, 은닉층 수를 2배로 늘리면 컴퓨팅 시간은 400% 증가하지만 정확성은 10%로 증가함)
 Output Layer (출력층)
 해결하고자 하는 문제의 성격 (예, 필기체 숫자를 인식한다면 0에서 9까지 10개 노드로 선정)
신경망 신경망의 순전파
뉴런(노드)의 처리 과정
 뉴런의 처리 과정과 활성화 함수 (Activation Function)의 등장
 좌측의 퍼셉트론의 처리과정을 표시한 식
𝑦 =
0 (𝑏 + 𝑤1 𝑥1 + 𝑤2 𝑥2 ≤ 0)
1 (𝑏 + 𝑤1 𝑥1 + 𝑤2 𝑥2 > 0)
 이 식을 2개의 식으로 구분
 가중치가 곱해진 입력 신호의 총합
 입력 신호의 총합 입력해 결과를 내는 함수
𝑎 = 𝑏 + 𝑤1 𝑥1 + 𝑤2 𝑥2
𝑦 = ℎ(𝑎)
 입력신호의 총합을 출력 신호로 변환하는 함수를 활성화 함수(Activation Function)라고 한다.
* 퍼셉트론에서 활성화 함수는 입력 신호의 총합이 0보다 크면 1, 작거나 같으면 0을 출력하는 함수이다.
신경망 신경망의 순전파
활성화 함수의 이해
 활성화 함수 (Activation Function)
 Synapse는 전달된 전기 신호가 최소한의 자극 값을 초과하면 활성화되어 다음 뉴런으로 전기신호를 전달한다.
 활성화 함수는 이것을 모방하여 값이 작을 때는 출력 값을 작은 값으로 막고, 일정한 값을 초과하면 출력 값이 커지
는 함수를 이용한다.
 신경망에서 Node는 전달받은 데이터를 가중치를 고려해 합산한 값을 활성화 함수를 적용해 다음 층에 전달한다.
 활성화 함수는 비선형 함수를 사용해야 한다.
 계단 함수나 시그모이드 함수처럼 값이 하나의 직선으로 나오지 않는 함수를 비선형함수라 함.
 선형 함수를 사용하면 신경망을 깊게 하는 의미가 없어짐 (선형 함수의 예 : 𝑓(𝑥)=𝑎𝑥+𝑏)
신경망의 순전파
활성화 함수의 종류
 활성화 함수의 종류
함수 위치 설명
계단 함수 - 퍼셉트론에서 사용된 함수로 0 또는 1로 출력. 실제 신경망에선 사용되지 않음.
Sigmoid 함수 은닉층 입력이 작으면 0에 가깝고 입력이 커지면 1에 가까워지는 함수로 실제 신경망에 자주 사용됨.
tanh 함수 은닉층 쌍곡 탄젠트 (Hyperbolic Tangent)함수로 Sigmoid와 유사한 모양
ReLU 함수 은닉층 Rectified Linear Unit Function (렐루함수)로 최근 신경망에 주로 이용
PReLU 함수 은닉층 Parametric ReLU or leaky ReLU로 ReLU를 보완.
Softmax 함수 출력층 출력층에서 사용되는 함수로 분류 문제를 해결할 때 사용
항등함수 출력층 입력을 그대로 출력하는 함수로 출력층에서 사용되는 함수
활성화 함수의 구현
활성화 함수의 구현 신경망의 순전파
계단 함수 구현하기
 계단 함수의 식
 계단 함수의 구현과 시각화
• 계단 함수는 NumPy의 배열(X)을 인수로 전달받았음.
• X > 0 은 넘파이 배열과 스칼라의 연산 결과로 bool 배열이 생성됨. [False, … False, True, … True]
• Y.astype 메서드로 배열 내 자료형을 np.int 형으로 변환 [0, … 0, 1, … 1]
ℎ(𝑥) =
1 (𝑥 > 0)
0 (𝑥 ≤ 0)
import numpy as np
import matplotlib.pyplot as plt
def step(X):
Y = X > 0
return Y.astype(np.int)
X = np.arange(-5, 5, 0.1)
Y1 = step(X)
plt.plot(X, Y1)
plt.show()
활성화 함수의 구현 신경망의 순전파
Sigmoid 함수 구현하기
 Sigmoid 함수의 식
 Sigmod 함수의 구현과 시각화
• Sigmoid 함수의 결과는 항상 0과 1사이의 값을 가진다.
ℎ(𝑥) =
1
1 + 𝑒−𝑥
import numpy as np
import matplotlib.pyplot as plt
def sigmoid(X):
return 1/(1+np.exp(-X))
X = np.arange(-5, 5, 0.1)
Y2 = sigmoid(X)
plt.plot(X, Y2)
plt.show()
활성화 함수의 구현 신경망의 순전파
ReLU 함수 구현하기
 ReLU 함수의 식
 ReLU 함수의 구현과 시각화
• ReLU 함수는 단순하여 학습 속도가 빠르고 학습이 잘 된다.
ℎ(𝑥) =
𝑥 (𝑥 > 0)
0 (𝑥 ≤ 0)
import numpy as np
import matplotlib.pyplot as plt
def relu(X):
return np.maximum(0,X)
X = np.arange(-5, 5, 0.1)
Y3 = relu(X)
plt.plot(X, Y3)
plt.show()
신경망의 순전파
신경망에서의 행렬 곱
신경망 구현
 신경망의 계산은 NumPy 배열이 제공하는 내적 연산을 이용하여 계산할 수 있다.
𝒙 𝟏
𝒙 𝟐
1
𝒚 𝟐
𝒚 𝟏
𝒚 𝟑
2
3
4
5
6
𝑥1 𝑥2
1 3 5
2 4 6
= 𝑦1 𝑦2 𝑦3
import numpy as np
X = np.array([1, 2])
W = np.array([[1, 3, 5],[2, 4, 6]])
Y = np.dot(X, W)
print(X)
print(W)
print(Y)
[1 2]
[[1 3 5]
[2 4 6]]
[ 5 11 17]
신경망의 순전파
3층 신경망의 설계
신경망 구현
 3층 신경망의 구성 예
Layer Node 수 Node Shape Weight Shape Bias shape 계산 식
입력층 2 (2, ) 2x3 Matrix (3, ) 은닉층 (1st) = 활성화함수((입력층x가중치1) + 편향1)
은닉층 (1st) 3 (3, ) 3x2 Matrix (2, ) 은닉층 (2nd) = 활성화함수((은닉층 (1st) x가중치2) + 편향2)
은닉층 (2nd) 2 (2, ) 2x2 Matrix (2, ) 출력층 = 활성화함수((은닉층 (2nd) x가중치3) + 편향3)
출력층 2 (2, )
𝒙 𝟏
𝒙 𝟐
𝒛 𝟐
(𝟏)
𝒛 𝟏
(𝟏)
𝒛 𝟑
(𝟏)
𝒛 𝟏
(𝟐)
𝒛 𝟐
(𝟐)
𝒚 𝟏
𝒚 𝟐
𝟏
𝟏
𝟏
w
b
• 은닉층의 활성화 함수는 Sigmoid 함수를 활용한다.
• 출력층의 활성화 함수는 항등함수를 활용한다.
• 가중치와 편향은 0.1 에서 0.9까지 임의의 값으로 지정한다.
• 은닉층의 계산 결과를 출력한다.
신경망의 순전파
3층 신경망의 구현
신경망 구현
 3층 신경망의 구현 코드 확인
import numpy as np
def sigmoid(X):
return 1/(1+np.exp(-X))
def identity(X):
return X
#1. 신경망초기화
W1 = np.array([[0.1, 0.3, 0.5],[0.2, 0.4, 0.6]])
W2 = np.array([[0.1, 0.4], [0.2, 0.5], [0.3, 0.6]])
W3 = np.array([[0.1, 0.3], [0.2, 0.4]])
b1 = np.array([0.1, 0.2, 0.3])
b2 = np.array([0.1, 0.2])
b3 = np.array([0.1, 0.2])
#2. 입력값
X = np.array([-2, 4])
print("입력층 : ", X)
#3. 순전파
Z1 = sigmoid(np.dot(X, W1) + b1)
print("1st 은닉층 : ", Z1)
Z2 = sigmoid(np.dot(Z1, W2) + b2)
print("2nd 은닉층 : ", Z2)
Y = identity(np.dot(Z2, W3) + b3)
print("출력층 : ", Y)
신경망의 순전파출력층 설계
신경망은 분류(Classification)와 회귀(Regression) 문제에 이용할 수 있으며, 목적에 맞게 출력층을 설계 해야 한다.
 출력층의 활성화 함수
• 회귀 문제를 해결할 때  항등 함수 (identity function) 이용
• 분류 문제를 해결할 때  소프트맥스 함수 (softmax function) 이용 *단, 학습에만 이용하고 추론 시에는 생략함
 항등 함수 (identity function)
• 입력을 그대로 출력, 즉 입력과 출력이 같다.
 분류 문제에서 출력층의 뉴런 수 정하기
• 분류하고 싶은 클래스 수로 설정
• 예를 들어 숫자 0에서 9까지 하나로 분류하고 싶으면 출력층의 뉴런을 10개로 설정
 Softmax 함수는 출력 값으로 확률벡터를 얻을 수 있다.
 출력 층에서의 Activation Function으로 자주 사용
 인공신경망의 출력 값으로 확률 벡터를 얻고 싶을 때 사용 (출력 값의 해석을 용이하기 한다.)
 분류문제에서 학습단계에 사용된 Softmax 함수는 추론 시에 생략한다. (출력 값이 큰 Node는 변하지 않음으로...)
분류 문제를 풀기 위해서 출력 층에서는 출력 값으로 확률벡터를 얻는 softmax 함수를 자주 사용한다.
 Softmax 함수는 각 output node의 출력을 0~1로 제한
 output node의 출력을 모두 합한 값은 항상 1
 Softmax function의 수식
 Softmax 함수 원리
𝒆 𝒚𝒊 : 지수함수 (exponential function)
신경망의 순전파출력층 설계
Softmax 함수의 구현
신경망의 순전파출력층 설계
 Softmax 함수의 식
 Softmax 함수 구현
import numpy as np
def softmax(X):
expX = np.exp(X)
sumExpX = np.sum(expX)
return expX / sumExpX
X = np.array([2.3, -0.9, 3.6])
Y = softmax(X)
print(Y, np.sum(Y)) [0.21231157 0.00865429 0.77903414] 1.0
Softmax 함수의 구현 (Cont’d)
신경망의 순전파출력층 설계
 지수함수로 인한 Overflow 발생 가능
 Softmax 함수 테스트
 지수함수는 입력 값이 커질 수록 계산결과가 매우 높은 값
이 된다.
 지수 함수 계산 결과가 매우 크면 overflow가 발생할 수
있다.
import numpy as np
def softmax(X):
expX = np.exp(X)
sumExpX = np.sum(expX)
return expX / sumExpX
X = np.array([990, 1000, 1010])
Y = softmax(X)
print(Y, np.sum(Y))
RuntimeWarning: invalid value encountered in true_divide
return expX / sumExpX
[nan nan nan] nan
Softmax 함수의 구현 (Cont’d)
신경망의 순전파출력층 설계
 오버플로우 문제의 해결
 Softmax 함수 변경
 C 라는 임의의 정수를 분자 분모 양쪽에 곱한 후
 C 를 지수함수 안으로 옮겨 log C 로 만든다.
 log C 를 𝐶′
로 대체
 즉,
• Softmax 함수는 임의의 정수를 더해도 결과는 바뀌지 않는다.
• 오버플로우를 막을 목적으로 입력 신호 중 최대값을 찾아 빼준다.
import numpy as np
def softmax(X):
expX = np.exp(X - np.max(X))
sumExpX = np.sum(expX)
return expX / sumExpX
X = np.array([990, 1000, 1010])
Y = softmax(X)
print(Y, np.sum(Y)) [2.06106005e-09 4.53978686e-05 9.99954600e-01] 0.9999999999999999
What is MNIST ?
 MNIST(Mixed National Institute of Standards and Technology)는 Handwritten Digit Image 집합이다
• 기계학습 분야에서 사용되는 손글씨 숫자 이미지 데이터 셋
• 실험용 데이터로 자주 사용된다.
• 0부터 9까지 숫자 이미지로 구성되어 있다
• 각 이미지가 실제 의미하는 숫자가 Label되어 있다.
• 훈련 이미지가 6만장, 시험 이미지가 1만장으로 준비되어 있다.
• 각 숫자는 가로, 세로 각각 28 픽셀 크기의 흑백 이미지이다
• https://en.wikipedia.org/wiki/MNIST_database
신경망의 순전파MNIST 적용
MINST를 위한 신경망 설계
 MNIST를 위한 신경망 설계 (3층 신경망)
• 입력층 : 784개 (이미지 크기가 28x28 픽셀임으로)
• 출력층 : 10개 (0에서 9로 분류함으로)
• 첫번째 은닉층 : 50개
• 두번째 은닉층 : 100개
• 은닉층의 활성화 함수는 Sigmoid 함수를 활용한다.
• 출력층의 활성화 함수는 Softmax 함수를 활용한다.
𝒙 𝟏
𝒙 𝟐
𝒛 𝟓𝟎
(𝟏)
𝒛 𝟏
(𝟏)
𝒛 𝟏𝟎𝟎
(𝟐)
𝒛 𝟏
(𝟐)
𝒛 𝟐
(𝟐)
𝒚 𝟏
𝒚 𝟏𝟎
𝟏
𝟏
𝟏
w
b
𝒙 𝟕𝟖𝟒
…
…
…
…
X W1 W2 W3  Y
784 784 x 50 50 x 100 100 x 10 10
일치 일치 일치 일치
• 신경망 각 층의 배열 형상 추이
신경망의 순전파MNIST 적용
MNIST 구현 1 - 데이터 준비
 MNIST 데이터 준비
• 훈련데이터(6만장), 검증데이터(1만장) 다운로드
• 신경망 처리에 맞게 데이터 전처리
신경망의 순전파MNIST 적용
전처리 항목 적용 여부 설명
이미지 정규화 False 0~255의 픽셀 값을 0.0~1.0으로 변환
이미지 평탄화 True 28x28 배열을 784 배열로 평탄화
레이블 One Hot Encoding False
정답을 뜻하는 원소만 1이고 나머지는 0으로 표기법
예) [0,0,1,0,0,0,0,0,0,0] 는 2를 나타냄
import pickle
import numpy as np
import matplotlib.pyplot as plt
import MyLib.mnist as mnist
#1.데이터 확보 및 전처리
(trainImg, trainLbl),(testImg, testLbl) = mnist.load_mnist(normalize=False, flatten=True, one_hot_label=False)
print(trainImg.shape)
print(trainLbl.shape)
print(testImg.shape)
print(testLbl.shape)
(60000, 784)
(60000,)
(10000, 784)
(10000,)
• load_mnist 함수는 http://yann.lecun.com/exdb/mnist/ 에서 데이터를 다운받아
/resources 경로에 pickle 형태(mnist.pkl)로 저장하는 함수
MNIST 구현 2 – 신경망 구성
 신경망 구성
• Weight와 Bias에 대한 값이 필요
• 설계된 신경망에 이미 학습된 가중치와 Bias를 저장한
파일(sample_weight.pkl)을 이용하여 신경망 구성
신경망의 순전파MNIST 적용
𝒙 𝟏
𝒙 𝟐
𝒛 𝟓𝟎
(𝟏)
𝒛 𝟏
(𝟏)
𝒛 𝟏𝟎𝟎
(𝟐)
𝒛 𝟏
(𝟐)
𝒛 𝟐
(𝟐)
𝒚 𝟏
𝒚 𝟏𝟎
𝟏
𝟏
𝟏
w
b
𝒙 𝟕𝟖𝟒
…
…
…
…
X W1 W2 W3  Y
784 784 x 50 50 x 100 100 x 10 10
일치 일치 일치 일치
import pickle
import numpy as np
import matplotlib.pyplot as plt
import MyLib.mnist as mnist
#1.데이터 확보 및 전처리
...
#2.신경망 초기화
with open("../resources/sample_weight.pkl","rb") as f:
network = pickle.load(f)
W1, W2, W3 = network['W1'], network['W2'], network['W3']
b1, b2, b3 = network['b1'], network['b2'], network['b3']
print(W1.shape)
print(W2.shape)
print(W3.shape)
print(b1.shape)
print(b2.shape)
print(b3.shape)
(784, 50)
(50, 100)
(100, 10)
(50,)
(100,)
(10,)
MNIST 구현 3 – 순전파 및 추론
 순전파 및 추론
• 3층 신경망에 훈련데이터를 순전파 (*활성화 함수로 Sigmoid와 Softmax를 활용)
• Softmax 결과 가장 높은 확률을 가진 것, 즉 추론(예측) 결과와 훈련레이블을 비교
• 정확도(Accuracy) 측정 : 신경망이 예측한 결과 정답의 비율 확인을 통해 정확도 계산
신경망의 순전파MNIST 적용
import ...
#1.데이터 확보 및 전처리 ...
#2.신경망 초기화 ...
#3.추론
def sigmoid(X):
return 1/(1+np.exp(-X))
def softmax(X):
expX = np.exp(X - np.max(X))
sumExpX = np.sum(expX)
return expX / sumExpX
accuracyCnt = 0
print(len(trainImg))
for idx in range(len(trainImg)):
X = trainImg[idx]
Z1 = sigmoid(np.dot(X, W1) + b1)
Z2 = sigmoid(np.dot(Z1, W2) + b2)
Y = softmax(np.dot(Z2, W3) + b3)
p = np.argmax(Y)
if p == trainLbl[idx]:
accuracyCnt += 1
print(accuracyCnt)
print(accuracyCnt / len(trainImg))
60000
55511
0.9251833333333334
MNIST 구현 4 - 이미지 시각화
 Matplotlib를 이용하여 Image Plot 처리
• 훈련데이터 첫 번째 이미지를 출력하고 레이블을 확인한다.
신경망의 순전파MNIST 적용
import pickle
import numpy as np
import matplotlib.pyplot as plt
import MyLib.mnist as mnist
#1.데이터 확보 및 전처리
...
#2.신경망 초기화
...
#3.추론
...
#4.이미지 시각화
img = trainImg[0].reshape(28,28)
lbl = trainLbl[0]
plt.imshow(img, cmap="gray")
plt.title("Label is %d" % lbl)
plt.show()
MINST 배치 처리 설계
 이미지 여러 장을 한꺼번에 처리 (배치처리) 하기
• 100장을 한꺼번에 처리하는 경우의 형상
 입력층은 100 x 784
 첫번째 은닉층은 100 x 50
 두번째 은닉층은 100 x 100
 출력층은 100 x 10
• 배치 처리의 장점
 수치 계산 라이브러리 대부분이 큰 배열을
효율적으로 처리하는 데 최적화 되어 있음.
 데이터 I/O 횟수를 줄여,
CPU, GPU가 계산에 집중
𝒙 𝟏
𝒙 𝟐
𝒛 𝟓𝟎
(𝟏)
𝒛 𝟏
(𝟏)
𝒛 𝟏𝟎𝟎
(𝟐)
𝒛 𝟏
(𝟐)
𝒛 𝟐
(𝟐)
𝒚 𝟏
𝒚 𝟏𝟎
𝟏
𝟏
𝟏
𝒙 𝟕𝟖𝟒
…
…
…
…
X W1 W2 W3  Y
100 x 784 784 x 50 50 x 100 100 x 10 100 x 10
일치 일치 일치 일치
• 신경망 각 층의 배열 형상 추이
(Bias와 Activation Function은 생략)
100x784
100x50
100x100
신경망의 순전파MNIST 적용
MINST 배치 처리 구현
신경망의 순전파MNIST 적용
#3-2. 배치처리 처리
batchSize = 100
accuracyCnt = 0
print(len(trainImg))
for idx in range(0, len(trainImg), batchSize):
X = trainImg[idx:idx+batchSize]
Z1 = sigmoid(np.dot(X, W1) + b1)
Z2 = sigmoid(np.dot(Z1, W2) + b2)
Y = softmax(np.dot(Z2, W3) + b3)
p = np.argmax(Y, axis=1)
accuracyCnt += np.sum(p == trainLbl[idx:idx+batchSize])
print(accuracyCnt)
print(accuracyCnt / len(trainImg))
 100건씩 배치처리 구현
실습
 다음 조건에 맞는 신경망을 구현한다.
• 입력 층 10개, 은닉층 #1은 5개, 은닉층 #2는 8개, 출력층은 4개로 설계한다.
• 가중치는 정규분포에서 Random으로 설정하고, 편향에 대한 가중치는 모두 0으로 세팅한다.
• 은닉층에는 ReLU 함수로 구성하고, 출력층에서는 항등함수로 구현한다.
• 은닉층의 출력 값을 확인하여 ReLU 함수의 적용 결과를 확인한다.
#1 – 3층 신경망 설계 및 구현
신경망의 순전파
𝒙 𝟏
𝒙 𝟐
𝒛 𝟓
(𝟏)
𝒛 𝟏
(𝟏)
𝒛 𝟖
(𝟐)
𝒛 𝟏
(𝟐)
𝒛 𝟐
(𝟐)
𝒚 𝟏
𝒚 𝟒
𝟏
𝟏
𝟏
𝒙 𝟏𝟎
…
…
…
…
실습
 제공되는 2개의 파일을 이용하여 MNIST를 위한 신경망 구축 및 추론과정을 진행한다.
• 제공되는 파일 : MyLib/mnist.py, resources/sample_weight.pkl
• 한번에 100개씩 연산할 수 있도록 배치 처리를 한다.
#2 – MNIST 구현하기
신경망의 순전파
IV. 신경망의 학습
신경망 학습의 개요 신경망의 학습
Widrow-Hoff Learning Rule
 위드로-호프 학습규칙(Widrow-Hoff Learning Rule / Delta Rule)
• 1960년 Bernard Widrow교수는 Perceptron과 유사한 ADALINE (Adaptive Linear Neuron) 단층 신경망 모델을 공개하
면서 위드로-호프 학습규칙(Widrow-Hoff Learning Rule) 즉, Delta Rule을 공개
• Delta Rule 이란 단층 신경망에서 적당한 가중치를 알아내기 위해 출력 층의 출력 값의 오차에 비례해 가중치를 조절
하는 것.
• 델타 규칙은 신경망의 오차가 충분히 들어들 때 까지 학습 데이터를 반복해서 재 학습해야 한다.
• 델타 규칙은 후에 역전파의 기본이론이 된다.
[From] http://coolingoff.tistory.com/8
학습이란 신경망에서 원하는 결과를 얻기 위해 뉴런 사이의 적당한 가중치를 알아내는 것. 즉 가중치를 최적화 하는 것이다.
 신경망 학습에 나오는 주요 개념
신경망 학습의 개요 신경망의 학습
용어 설명
훈련 데이터 Training Data 신경망 훈련에 사용하는 데이터.
시험 데이터 Test Data 훈련된 신경망 모델을 평가하는 데이터
오차 Loss / Cost 신경망 순전파 된 결과와 학습데이터의 레이블과의 차이
손실함수 / 비용함수
Loss / Cost
Function
오차를 측정하기 위한 함수.
미니배치 학습 Mini Batch 훈련데이터 중 일부만 골라 학습을 수행하는 것
기울기 Gradient 모든 변수의 편미분을 벡터로 정리한 것. 신경망에서는 손실함수의 기울기
경사 하강법
Gradient Descent
Method
기울기를 이용해 함수의 최소값을 찾는 방법, 가중치 최적화에 활용
학습률 Learning Rate 한 번의 학습에 얼마만큼 학습을 진행하는 지에 대한 설정
하이퍼파라미터 Hyper Parameter 학습률 같이 사람이 직접 설정해야 하는 매개변수
에폭 Epoch 학습 시 훈련 데이터를 모두 소진했을 때의 횟수
역전파 Back Propagation 역 방향으로 오차를 전파하면서 신경망 가중치와 편향을 최적화
과적합 Overfitting 훈련데이터에 지나치게 최적화된 상태로 실제 성능은 떨어짐
학습 데이터에 너무 지나치게 맞추다 보면 일반화 성능이 떨어지는 모델을 얻게 되는 현상을 과적합(Overfitting)이라고 한다.
 Under Fitting
적정 수준의 학습을 하지 못하여 실제 성능이 떨어지는 경우
 Normal Fitting (Generalized Fitting)
적정 수준의 학습으로 실제 적정한 일반화 수준을 나타냄. 기계 학습이 지향하는 수준.
 Over Fitting
학습 데이터에 성능이 좋지만 실제 데이터에 관해 성능이 떨어짐. 특히 조심해야 함.
신경망 학습의 개요 신경망의 학습
손실 함수 / 비용 함수 신경망의 학습
 손실 함수의 종류
비용함수란 신경망 학습에서 학습 데이터에 대한 오차를 측정하는 척도이다.
용어 설명
평균 제곱 오차 MSE (Mean Squared Error) 𝑬 =
𝟏
𝒌
(𝒚 𝒌 − 𝒕 𝒌) 𝟐
𝒌
교차 엔트로피 오차 CEE (Cross Entropy Error) 𝑬 = − 𝒕 𝒌 𝐥𝐨𝐠 𝒚 𝒌
𝒌
 손실 함수를 사용하는 이유
• 신경망에서 가중치와 편향을 최적화 할 때 손실
함수의 값을 가증한 작게 하는 값을 찾는다.
• 이 때 미분(기울기)을 활용하고, 그 미분 값을 단
서로 가중치와 편한 값을 서서히 갱신한다.
[From] https://medium.com/data-science-group-iitr/loss-functions-and-optimization-algorithms-demystified-bb92daff331c
손실 함수 / 비용 함수 신경망의 학습
평균 제곱 오차 (Mean Squared Error, MSE)
𝑬 =
𝟏
𝒌
(𝒚 𝒌 − 𝒕 𝒌) 𝟐
𝒌
• 𝒚 𝒌 : 신경망의 출력 (신경망이 추정한 값)
• 𝒕 𝒌 : 정답 레이블
• 𝒌 : 데이터의 차원 수
(MNIST에서는 0에서 9의 10개)
 평균 제곱 오차 함수의 이해
• 각 원소의 출력과 정답 레이블의 차의 제곱에 평균을 취한 것
• One Hot Encoding 시 정답의 출력과 정답이 아닌 출력의 오차
를 모두 계산
 평균 제곱 오차 식
손실 함수 / 비용 함수 신경망의 학습
평균 제곱 오차 (Mean Squared Error, MSE)
import numpy as np
def meanSquaredError(Y, T):
return ((Y-T)**2).mean()
# 정답은 '2'
T = np.array([0, 0, 1, 0, 0, 0, 0, 0, 0, 0])
# '2'일 확률이 가장 높음.
Y = np.array([0.1, 0.1, 0.6, 0, 0.1, 0.1, 0, 0, 0, 0])
print('정답인 경우 평균제곱오차 %f' % meanSquaredError(Y, T))
# '4'일 확률이 가장 높음.
Y = np.array([0.1, 0.0, 0.1, 0, 0.7, 0.1, 0, 0, 0, 0])
print('오답인 경우 평균제곱오차 %f' % meanSquaredError(Y, T))
 평균제곱오차의 구현
정답인 경우 평균제곱오차 0.020000
오답인 경우 평균제곱오차 0.132000
손실 함수 / 비용 함수 신경망의 학습
교차 엔트로피 오차 (Cross Entropy Error, CEE)
 교차 엔트로피 오차 식
𝑬 = − 𝒕 𝒌 𝐥𝐨𝐠 𝒚 𝒌
𝒌
• 𝒚 𝒌 : 신경망의 출력 (0에서 1사이어야 한다)
• 𝒕 𝒌 : 정답 레이블 (정답이 아닌 나머지는 𝑡 𝑘 가 0임으로 곱해도 0이 된다.
• log : 밑이 e인 자연로그 (log 𝑒 𝒚 𝒌)
 교차 엔트로피 오차 함수의 이해
• One Hot Encoding 시 정답이 아닌 출력 노드의
레이블(t) 값은 0임으로 정답일 때의 출력만 전체
손실 값을 정하는데 사용된다.
• 자연로그 그래프
 𝒙가 1일 때 𝒚는 0이 된다. (즉, loss = 0)
 𝒙가 0에 가까워질수록 𝒚값은 점점 작아진다
(손실 값은 작아진다.)
 𝒙가 0이면 𝒚는 –inf가 된다. (무한대)
(손실 값은 오차가 클수록 커진다.)
자연로그의 그래프 (𝒚 = 𝐥𝐨𝐠 𝒙)
손실 함수 / 비용 함수 신경망의 학습
교차 엔트로피 오차 (Cross Entropy Error, CEE)
 교차 엔트로피 오차의 구현
import numpy as np
def crossEntropyError(Y, T):
delta = 1e-7
return -np.sum(T*np.log(Y+delta))
# 정답은 '2'
T = np.array([0, 0, 1, 0, 0, 0, 0, 0, 0, 0])
# '2'일 확률이 가장 높음.
Y = np.array([0.1, 0.1, 0.6, 0, 0.1, 0.1, 0, 0, 0, 0])
print('정답인 경우 교차엔트로피 %f' % crossEntropyError(Y, T))
# '4'일 확률이 가장 높음.
Y = np.array([0.1, 0.0, 0.1, 0, 0.7, 0.1, 0, 0, 0, 0])
print('오답인 경우 교차엔트로피 %f' % crossEntropyError(Y, T))
정답인 경우 교차엔트로피 0.510825
오답인 경우 교차엔트로피 2.302584
• 교차 엔트로피 오차 구현 시 아주 작은 delta를 더해주는 이유
no.log(x) 계산 시 x 값이 0이면 –inf가 되어 계산이 불가능함으로 아주 작은 값을 더해서 0 이 되지 않도록 함.
Mini-batch 학습이란 훈련 데이터로부터 일부만 골라서 학습을 수행하는 방식이다.
 Mini-batch 학습이 필요한 이유
• 가중치를 조절하기 위한 비용함수의 계산은 모든 훈련데이터를 1회 마치고 비용 함수의 합을 구해야 한다.
• 하지만 데이터가 많은 경우 (MNIST는 6만개) 손실함수 이렇게 구하는 건 비 현실적이다.
• 이를 개선하기 위해 신경망 학습에서 훈련 데이터의 일부만 골라 학습하는 방법을 미니배치 학습이라고 한다.
(즉, 표본을 뽑아 학습한다.)
* 학습의 의미 : 손실함수를 계산하여 가중치 / 편향 조정을 한다.
손실 함수 / 비용 함수 신경망의 학습
 미니배치 학습 시 교차 엔트로피 오차 식
𝑬 = −
𝟏
𝑵
𝒕 𝒏𝒌 𝐥𝐨𝐠 𝒚 𝒏𝒌
𝒌𝒏
• 1개의 손실함수를 N개로 확장하고 나누어 평균 손실
함수를 구함.
• N은 미니배치 사이즈
Mini-batch 학습 구현 – 훈련 데이터 추출
 훈련 데이터에서 무작위로 10개 추출
• np.random.choice(60000,10) 은 0에서 60000 미만의 수 중에서 무작위로 10개를 추출
손실 함수 / 비용 함수 신경망의 학습
import numpy as np
import MyLib.mnist as mnist
#1.데이터 확보 및 전처리
(trainImg, trainLbl),(testImg, testLbl) = mnist.load_mnist(normalize=True, flatten=True, one_hot_label=True)
print(trainImg.shape)
print(trainLbl.shape)
print(testImg.shape)
print(testLbl.shape)
batchSize = 10
trainSize = trainImg.shape[0] # 60000
batchMask = np.random.choice(trainSize, batchSize)
print(batchMask)
batchImg = trainImg[batchMask]
batchLbl = trainLbl[batchMask]
print(batchLbl)
print(batchLbl.argmax(axis=1))
(60000, 784)
(60000, 10)
(10000, 784)
(10000, 10)
[12480 21053 50739 18430 45945 34843 24757 10842 28145 19516]
[[0. 0. 0. 0. 0. 0. 1. 0. 0. 0.]
[0. 0. 1. 0. 0. 0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0. 1. 0. 0. 0. 0.]
[0. 0. 0. 0. 0. 0. 1. 0. 0. 0.]
[0. 0. 0. 1. 0. 0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0. 1. 0. 0. 0. 0.]
[0. 0. 0. 0. 0. 0. 0. 0. 1. 0.]
[0. 1. 0. 0. 0. 0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0. 0. 0. 1. 0. 0.]
[0. 1. 0. 0. 0. 0. 0. 0. 0. 0.]]
[6 2 5 6 3 5 8 1 7 1]
Mini-batch 학습 구현 – (미니) 배치용 교차 엔트로피 오차 함수 구하기
 미니배치용 교차 엔트로피 함수 구현
손실 함수 / 비용 함수 신경망의 학습
import numpy as np
def crossEntropyError(Y, T):
delta = 1e-7
if Y.ndim == 1:
T = T.reshape(1, T.size)
Y = Y.reshape(1, Y.size)
batchSize = Y.shape[0]
return -np.sum(T*np.log(Y+delta)) / batchSize
# return -np.sum(T*np.log(Y+delta))
# 정답은 '2'
T = np.array([0, 0, 1, 0, 0, 0, 0, 0, 0, 0])
# '2'일 확률이 가장 높음.
Y = np.array([0.1, 0.1, 0.6, 0, 0.1, 0.1, 0, 0, 0, 0])
print('정답인 경우 교차엔트로피 %f' % crossEntropyError(Y, T))
# '4'일 확률이 가장 높음.
Y = np.array([0.1, 0.0, 0.1, 0, 0.7, 0.1, 0, 0, 0, 0])
print('오답인 경우 교차엔트로피 %f' % crossEntropyError(Y, T))
정답인 경우 교차엔트로피 0.510825
오답인 경우 교차엔트로피 2.302584
미분과 기울기 신경망의 학습
미분은 특정 순간의 변화량이다.
 미분 수식
𝒅𝒇(𝒙)
𝒅𝒙
= lim
ℎ→𝟎
𝒇 𝒙 + 𝒉 − 𝒇(𝒙)
𝒉
•
𝒅𝒇(𝒙)
𝒅𝒙
: 미분, 즉 𝒙에 대한 𝒇(𝒙)의 변화량
• 𝒉 : 시간
• 𝒍𝒊𝒎
𝒉→𝟎
: 시간이 0에 가까워짐.
• 자유 낙하 과정을 함수로 구할
수 있으며, 여기에 미분을 취하
면 순간 속도가 된다.
 해석적 미분
• 고등학교 수학시간에 배운 미분
• 𝒚 = 𝒙 𝟐
의 해석적 미분은
𝒅𝒚
𝒅𝒙
= 𝟐𝒙 이다
즉, x=2일 때, 미분은 4가 된다.
• 다항함수의 미분공식
[From] https://ko.wikipedia.org/wiki/%EB%AF%B8%EB%B6%84
미분과 기울기 신경망의 학습
미분 값은 접선의 기울기이다.
 연속적이고 매끄러운 함수 (미분 가능한 함수)에서 특정
지점의 접선의 기울기는 그 점에서의 미분 값과 같다
 점 Q가 점 P로 움직일 경우 직선 PQ의 기울기는 점 P
에서의 접선의 기울기와 같다.
 접선의 기울기
[From] https://ko.wikipedia.org/wiki/%EB%AF%B8%EB%B6%84
미분 가능하지 않는 경우
미분과 기울기 신경망의 학습
수치 미분(Numerical Differentiation)은 근사치를 이용해서 계산하는 방법이다.
 수치 미분
• 시간 h는 무한의 0으로 좁히는 것은 불가능 하다.
• 따라서, 미분 값을 계산하기 위해 h에 아주 작은 값을 대입하여 계산하는 방법을 수치 미분이라 한다.
• 시간을 나타내는 h에 가급적 낮은 값을 넣어야 하는데 너무 작은 값 (예, 0.00….1) 을 넣으면 컴퓨터 계
산에 문제가 발생한다.
• 따라서 근사치를 이용하여 계산한다.
h는 0.0001이 가장 좋다
 중앙 차분을 이용한 수치 미분
• 수치 미분은 오차가 포함
• 오차를 줄이기 위해 x를 중심으로 전후의 차분을
계산하는 것을 중앙 차분 이라 한다.
• 중앙 차분 수식
𝒅𝒇(𝒙)
𝒅𝒙
=
𝒇 𝒙 + 𝒉 − 𝒇(𝒙 − 𝒉)
𝟐𝒉
미분과 기울기 신경망의 학습
수치 미분(Numerical Differentiation)의 구현
 𝐲 = 𝟎. 𝟎𝟏𝒙 𝟐
+ 𝟎. 𝟏𝒙 의 미분
•
𝒅𝒚
𝒅𝒙
= 𝟎. 𝟎𝟏 ∗ 𝟐 ∗ 𝒙 + 𝟎. 𝟏
• x=5 일 때 미분 값은 0.2
• x=10 일 때 미분 값은 0.3
• 수치 미분으로 계산하더라도 값의 차는 거의 없다.
 𝐲 = 𝟎. 𝟎𝟏𝒙 𝟐
+ 𝟎. 𝟏𝒙 의 수치 미분 구현
import numpy as np
import matplotlib.pyplot as plt
def diff(f, x):
h = 1e-4
return (f(x+h)-f(x-h))/(2*h)
def sFunc1(x):
return 0.01*x**2 +0.1*x
X = np.arange(0, 20, 0.1)
Y = sFunc1(X)
plt.xlabel("x")
plt.ylabel("f(x)")
plt.plot(X, Y)
plt.show()
print(diff(sFunc1, 5))
print(diff(sFunc1, 10))
0.1999999999990898
0.2999999999986347
미분과 기울기 신경망의 학습
편미분
 편미분 정의
• 변수가 2개 이상인 함수를 미분할 때 미분 대상 변수 외에 나머지 변수를 상수처럼 고정시켜 미분하는 것.
 편미분 구하기
• 함수 예) 𝑓 𝑥0, 𝑥1 = 𝑥0
2
+ 𝑥1
2
• 𝒙 𝟎 = 𝟑, 𝒙 𝟏 = 𝟒 인 경우 편미분
𝝏𝒇
𝝏𝒙 𝟎
와
𝝏𝒇
𝝏𝒙 𝟏
는?
•
𝝏𝒇
𝝏𝒙 𝟎
= 2𝑥0 즉 6이 된다.
•
𝝏𝒇
𝝏𝒙 𝟏
= 2𝑥1 즉 8이 된다.
미분과 기울기 신경망의 학습
기울기(Gradient)
 기울기 정의
• 모든 변수의 편미분을 벡터로 정리한 것.
• 𝒇 𝒙 𝟎, 𝒙 𝟏 = 𝒙 𝟎
𝟐
+ 𝒙 𝟏
𝟐
인 경우 기울기는 (
𝝏𝒇
𝝏𝒙 𝟎
,
𝝏𝒇
𝝏𝒙 𝟏
)이다.
 기울기 구하기
• 함수 예) 𝑓 𝑥0, 𝑥1 = 𝑥0
2
+ 𝑥1
2
• 𝒙 𝟎 = 𝟑, 𝒙 𝟏 = 𝟒 인 경우 기울기 ∶ (𝟔, 𝟖)
• 𝒙 𝟎 = 𝟎, 𝒙 𝟏 = 𝟐 인 경우 기울기 ∶ (𝟎, 𝟒)
• 𝒙 𝟎 = 𝟑, 𝒙 𝟏 = 𝟎 인 경우 기울기 ∶ (𝟔, 𝟎)
 기울기 시각화
• 기울기를 방향을 가진 벡터로 표시
• 기울기가 가리키는 쪽은 각 지점에서 함수의
출력 값을 가장 크게 줄이는 방향이다.
미분과 기울기 신경망의 학습
기울기(Gradient)라의 구현
 𝒇 𝒙 𝟎, 𝒙 𝟏 = 𝒙 𝟎
𝟐
+ 𝒙 𝟏
𝟐
인 함수의 기울기 구하기
import numpy as np
def grad(f, x):
h = 1e-4
grad = np.zeros_like(x) # x와 같은 형상의 배열
for idx in range(x.size):
tmp = x[idx]
x[idx] = tmp+h
fx1 = f(x) # f(x+h)
x[idx] = tmp-h
fx2 = f(x) # f(x-h)
grad[idx] = (fx1-fx2)/(2*h)
x[idx] = tmp # 원래 값으로
return grad
def sFunc2(x):
return x[0]**2 + x[1]**2
print(grad(sFunc2, np.array([3.0, 4.0])))
print(grad(sFunc2, np.array([0.0, 2.0])))
print(grad(sFunc2, np.array([3.0, 0.0])))
[6. 8.]
[0. 4.]
[6. 0.]
신경망의 학습
기울기(Gradient) 신경망 적용
 가중치 매개 변수에 대한 비용함수의 기울기 구하기
미분과 기울기
 가중치 W, 손실 함수 L인 신경망의 기울기
• 2x3 형상의 가중치 𝑾의 형상과 기울기
𝝏𝑳
𝝏𝑾
의 형상은 아래와 같이 표시할 수 있다.
𝑾 =
𝒘 𝟏𝟏 𝒘 𝟏𝟐 𝒘 𝟏𝟑
𝒘 𝟐𝟏 𝒘 𝟐𝟐 𝒘 𝟐𝟑
𝝏𝑳
𝝏𝑾
=
𝝏𝑳
𝝏𝒘 𝟏𝟏
𝝏𝑳
𝝏𝒘 𝟏𝟐
𝝏𝑳
𝝏𝒘 𝟏𝟑
𝝏𝑳
𝝏𝒘 𝟐𝟏
𝝏𝑳
𝝏𝒘 𝟐𝟐
𝝏𝑳
𝝏𝒘 𝟐𝟑
𝒙 𝟏
𝒙 𝟐
𝒚 𝟐
𝒚 𝟏
𝒚 𝟑
• 기울기가 가리키는 쪽은 각 지점에서 함수의 출력 값을 가장 크게 줄이는 방향이다.
• 손실함수의 값을 줄이기 위한 가중치 매개 변수의 기울기 값을 구해야 한다.
• 가중치 매개 변수의 기울기가 가리키는 방향이 손실함수의 값을 줄일 수 있는 방향이다.
기울기 신경망
변수 각 연결의 Weight
함수 손실함수 / 비용함수
기울기 가중치 매개변수에 대한 비용함수의 기울기
 신경망에 기울기 대입
신경망의 학습
기울기 신경망 적용 구현 예
미분과 기울기
 은닉층 없이 입력층 2개, 출력층 3개 뉴런으로 구성된 신경망을 구현하고, 1회 학습으로 손실함수와 기울기를 구한다.
• 가중치는 정규분포를 이용해서 초기화 한다.
• 출력증의 활성화 함수는 Softmax를 사용하고 비용함수는 교차엔트로피 함수를 사용한다.
import numpy as np
from MyLib.functions import softmax, cross_entropy_error
from MyLib.gradient import numerical_gradient
class SimpleNet:
def __init__(self):
self.W = np.random.randn(2,3)
def predict(self, x):
z = np.dot(x, self.W)
y = softmax(z)
return y
def loss(self, x, t):
y = self.predict(x)
loss = cross_entropy_error(y, t)
print("가중치 n", self.W, "n - 손실 값 : ", loss)
return loss
net = SimpleNet() # 가중치 초기화
x = np.array([0.6, 0.9]) # 입력 값
t = np.array([0, 0, 1]) # 정답레이블
print("입력값: ", x)
print("가중치 초기값: n", net.W)
print("=================================================")
f = lambda w: net.loss(x,t)
grad = numerical_gradient(f, net.W)
print("=================================================")
print("신경망 기울기: n", grad)
입력값: [0.6 0.9]
가중치 초기값:
[[ 0.96339351 1.23666218 0.18362639]
[-0.64247516 0.84511081 0.30620984]]
=========================================
가중치
[[ 0.96349351 1.23666218 0.18362639]
[-0.64247516 0.84511081 0.30620984]]
- 손실 값 : 1.5549822034660628
가중치
[[ 0.96329351 1.23666218 0.18362639]
[-0.64247516 0.84511081 0.30620984]]
- 손실 값 : 1.554964975018745
가중치
[[ 0.96339351 1.23676218 0.18362639]
[-0.64247516 0.84511081 0.30620984]]
- 손실 값 : 1.555012303511828
가중치
[[ 0.96339351 1.23656218 0.18362639]
[-0.64247516 0.84511081 0.30620984]]
- 손실 값 : 1.554934875354396
...  가중치가 6개임으로 12번 계산
==========================================
신경망 기울기:
[[ 0.08614224 0.38714079 -0.47328302]
[ 0.12921335 0.58071118 -0.70992454]]
(1.5549822034660628-1.554964975018745)/0.0002=0.08614224
경사 하강법 신경망의 학습
경사 하강법 (Gradient Descent Method)
 경사 하강법이란?
• 기울기를 잘 이용해 함수의 최솟값 (또는 가능한 한 작은 값)을 찾는 방법
• 기울기를 계산하고 기울어진 방향으로 적당히 움직이는 단계를 반복
 경사 하강법 수식
• 𝜂 : 학습률 (learning rate)
한 번의 학습으로 얼마만큼 학습해야 하는 지
• 위 단계를 반복하면서 함수의 값을 줄이는 것
𝑥𝑖 = 𝑥𝑖 − 𝜂
𝜕𝑓
𝜕𝑥𝑖
경사 하강법 신경망의 학습
경사 하강법 (Gradient Descent Method)의 구현
 𝒇 𝒙 𝟎, 𝒙 𝟏 = 𝒙 𝟎
𝟐
+ 𝒙 𝟏
𝟐
인 함수의 최솟값을 경사 하강법으로 구하기
import numpy as np
def grad(f, x):
h = 1e-4
grad = np.zeros_like(x) # x와 같은 형상의 배열
for idx in range(x.size):
tmp = x[idx]
x[idx] = tmp+h
fx1 = f(x) # f(x+h)
x[idx] = tmp-h
fx2 = f(x) # f(x-h)
grad[idx] = (fx1-fx2)/(2*h)
x[idx] = tmp # 원래 값으로
return grad
def gradDescent(f, initX, lr, step=100):
x = initX
for i in range(step):
print(x)
x -= lr*grad(f, x)
print(x)
return x
def sFunc2(x):
return x[0]**2 + x[1]**2
initX = np.array([-3.0, 4.0])
finalX = gradDescent(sFunc2, initX, 0.1)
[-3. 4.]
[-2.4 3.2]
[-1.92 2.56]
[-1.536 2.048]
[-1.2288 1.6384]
[-0.98304 1.31072]
[-0.786432 1.048576]
[-0.6291456 0.8388608]
[-0.50331648 0.67108864]
[-0.40265318 0.53687091]
[-0.32212255 0.42949673]
[-0.25769804 0.34359738]
[-0.20615843 0.27487791]
[-0.16492674 0.21990233]
[-0.1319414 0.17592186]
...
[-5.69141277e-09 7.58855036e-09]
[-4.55313022e-09 6.07084029e-09]
[-3.64250417e-09 4.85667223e-09]
[-2.91400334e-09 3.88533778e-09]
[-2.33120267e-09 3.10827023e-09]
[-1.86496214e-09 2.48661618e-09]
[-1.49196971e-09 1.98929295e-09]
[-1.19357577e-09 1.59143436e-09]
[-9.54860614e-10 1.27314749e-09]
[-7.63888491e-10 1.01851799e-09]
[-6.11110793e-10 8.14814391e-10]
 이 값은 [0,0]과 거의 같음
경사 하강법 신경망의 학습
경사 하강법 (Gradient Descent Method)에서 학습률의 영향
 𝒇 𝒙 𝟎, 𝒙 𝟏 = 𝒙 𝟎
𝟐
+ 𝒙 𝟏
𝟐
인 함수의 경사 하강법에서 학습률을 0.0001, 0.1, 10 적용해 보기
import numpy as np
def grad(f, x):
...
def gradDescent(f, initX, lr, step=100):
x = initX
for i in range(step):
print(x)
x -= lr*grad(f, x)
print(x)
return x
def sFunc2(x):
return x[0]**2 + x[1]**2
initX = np.array([-3.0, 4.0])
finalX = gradDescent(sFunc2, initX, 0.0001)
initX = np.array([-3.0, 4.0])
finalX = gradDescent(sFunc2, initX, 0.1)
initX = np.array([-3.0, 4.0])
finalX = gradDescent(sFunc2, initX, 10)
[-2.94059014 3.92078685]
[-6.11110793e-10 8.14814391e-10]
[-2.58983747e+13 -1.29524862e+12]
• 학습률이 너무 작으면 값이 거의 갱신되지 않음.
• 학습률이 너무 크면 큰 값으로 발산함.
 적절한 학습률이 중요
 적절한 학습률은 가중치와는 다르게 사람이 직접 설정하는 하이퍼파라미터(Hyper parameter)임.
[From] https://www.oreilly.com/library/view/hands-on-machine-learning/9781491962282/ch04.html
Learning rate too small
Learning rate too large
경사 하강법 신경망의 학습
신경망 학습 순서
 경사 하강법 (Gradient Descent Method)을 이용한 신경망 학습
신경망 설계 미니배치 기울기 산출 매개변수 갱신 성능평가
[ 반복학습 ]
단계 설명
신경망 설계 목적에 적합한 신경망 설계 : 층의 깊이, 뉴런의 수, 활성화 함수 등
미니 배치 훈련 데이터의 일부 추출
기울기 산출 손실 함수의 값을 줄이기 위해 각 매개변수의 기울기 산출
매개변수 갱신 가중치 매개변수를 기울기 방향으로 아주 조금 갱신
성능평가 훈련데이터가 아닌 시험데이터로 완성된 모델의 성능을 평가. Overfitting 확인
확률적 경사 하강법 (SGD)
신경망의 학습
 확률적 경사 하강법 : Stochastic Gradient Descent (SGD)
• 훈련 데이터에서 소량의 데이터를 적당히 선택(미니 배치)해 손실을 계산한 후 매개 변수 갱신 처리를 수행
• 만약 모든 훈련 데이터를 손실을 계산한다면,
 훈련 데이터가 많다면 계산이 많아져 학습이 오래 걸린다.
 가중치 초기 설정에 따라 Global Minimum이 아닌 Local Minimum 값으로 수렴할 수 이다.
• 만약 하나의 학습 데이터마다 손실을 계산한다면,
 개별 훈련 데이터마다 매개변수를 갱신함으로 오차에 민감하고, 신경망 성능이 들쑥날쑥 변한다.
• 대부분 딥러닝 프레임워크는 SGD라는 함수로 이 기능을 구현하고 있음.
경사 하강법
에폭 (Epoch)
신경망의 학습
 Epoch의 정의
• 신경망 학습에 사용되는 단위
• 1 epoch : 학습 시 훈련 데이터를 모두 소진했을 때의 횟수
• 예) MNIST 훈련 데이터 6만장을 100개의 미니배치로 학습할 경우 SGD 600번 반복하면 1 epoch이 된다.
경사 하강법
 학습 시킨 데이터도 재 학습 시키면 신경망이 개선된다.
• 단, 학습을 너무 많이 시키면 훈련데이터에 오버피팅 되는 현상이 나타난다.
[From] https://www.oreilly.com/library/view/hands-on-machine-learning/9781491962282/ch04.html
MINST를 위한 신경망 설계
 MNIST를 위한 신경망 설계 (2층 신경망)
• 입력층 : 784개 (이미지 크기가 28x28 픽셀임으로)
• 은닉층 : 100개
• 출력층 : 10개 (0에서 9로 분류함으로)
• 은닉층의 활성화 함수는 Sigmoid 함수를 활용한다.
• 출력층의 활성화 함수는 Softmax 함수를 활용한다.
• 가중치는 정규분포로 초기화한다.
• 손실함수는 교차엔트로피함수를 사용한다.
• 학습은 미니배치로 100개를 추출하여 학습하고
1,000번 반복 학습한다.
• 학습률은 0.1로 한다
MNIST 적용 신경망의 학습
𝒙 𝟏
𝒙 𝟐
𝒛 𝟏𝟎𝟎
(𝟏)
𝒛 𝟏
(𝟏) 𝒚 𝟏
𝒚 𝟏𝟎
𝟏
𝟏
w
b
𝒙 𝟕𝟖𝟒
…
…
…
X W1 W2  Y
784 784 x 100 100 x 10 10
일치 일치 일치
MINST 구현 1 – 2층 신경망 클래스 구현
MNIST 적용 신경망의 학습
import numpy as np
import MyLib.functions as mf
import MyLib.gradient as mg
class MnistNet:
def __init__(self, inputSize, hiddenSize, outputSize, weightInitStd=0.01):
self.params = {}
self.params['W1'] = weightInitStd * np.random.randn(inputSize, hiddenSize)
self.params['W2'] = weightInitStd * np.random.randn(hiddenSize, outputSize)
self.params['b1'] = np.zeros(hiddenSize)
self.params['b2'] = np.zeros(outputSize)
def predict(self, x):
z = mf.sigmoid(np.dot(x, self.params['W1']) + self.params['b1'])
y = mf.softmax(np.dot(z, self.params['W2']) + self.params['b2'])
return y
def loss(self, x, t):
y = self.predict(x)
return mf.cross_entropy_error(y, t)
def accuracy(self, x, t):
y = self.predict(x)
y = np.argmax(y, axis=1)
t = np.argmax(t, axis=1)
accuracy = np.sum(y==t) / float(x.shape[0])
return accuracy
def grad(self, x, t):
lossW = lambda W : self.loss(x, t)
grad = {}
grad['W1'] = mg.numerical_gradient(lossW, self.params['W1'])
grad['W2'] = mg.numerical_gradient(lossW, self.params['W2'])
grad['b1'] = mg.numerical_gradient(lossW, self.params['b1'])
grad['b2'] = mg.numerical_gradient(lossW, self.params['b2'])
return grad
MINST 구현 2 – 미니배치 학습 구현
MNIST 적용 신경망의 학습
import numpy as np
from MyLib.mnist import load_mnist
from Training.MnistNet import MnistNet
#1.데이터 확보 및 전처리
(trainImg, trainLbl),(testImg, testLbl) = load_mnist(one_hot_label=True)
#2.신경망 초기화
network = MnistNet(784, 50, 10)
#3.하이퍼파라미터 초기화
itersNum = 1000
learningRate = 0.1
batchSize = 100
trainSize = trainImg.shape[0]
#4.학습진행현황 기록변수
trainLossList = []
print("-- 학습 시작 --")
# 학습
for i in range(itersNum):
# 미니배치
miniBatchMask = np.random.choice(trainSize, batchSize)
trainImgBatch = trainImg[miniBatchMask]
trainLblBatch = trainLbl[miniBatchMask]
# 기울기계산
grad = network.grad(trainImgBatch, trainLblBatch)
# 매개변수갱신
for key in ('W1', 'W2', 'b1', 'b2'):
network.params[key] -= learningRate*grad[key]
# 손실합수의 값 기록
loss = network.loss(trainImgBatch, trainLblBatch)
trainLossList.append(loss)
print("iteration %d 손실 값: %f" % (i, loss))
print("-- 학습 종료 --")
-- 학습 시작 --
iteration 0 : 2.29192863536
iteration 1 : 2.29489284268
iteration 2 : 2.28903658939
… 결과 생략 …
iteration 997 : 0.489302945227
iteration 998 : 0.454912045635
iteration 999 : 0.494802915552
-- 학습 종료 –
 학습에 하루가 소요
실습 신경망의 학습
 𝒇 𝒙 𝟎, 𝒙 𝟏, 𝒙 𝟐 = 𝟓𝒙 𝟎
𝟑
+ 𝟑𝒙 𝟏
𝟐
+ 𝟕𝒙 𝟐인 함수의 기울기 구하기
• 𝒇 𝟐, 𝟑, 𝟒 일 때 함수 계산 결과는 95이고, 기울기는 (60, 18, 7) 이다.
#1 – 기울기 계산
실습 신경망의 학습
 𝒇 𝒙 𝟎, 𝒙 𝟏, 𝒙 𝟐 = 𝟓𝒙 𝟎
𝟑
+ 𝟑𝒙 𝟏
𝟐
+ 𝟕𝒙 𝟐인 함수에 경사하강법 적용하기
• 초기값 : 𝒇 𝟐, 𝟑, 𝟒
• 학습률 : 0.05
• 반복횟수 : 20회
• 경사하강법 적용 후 이동된 X 값, 함수 계산 결과, 이동 후 기울기 값을 구한다.
#2 – 경사하강법 적용
V. 신경망의 역전파
Computational Graph
 Computational Graph (계산 그래프)란 계산 과정을 그래프로 나타낸 것이다.
사과 2개, 귤 3개를 사는데 사과는 1개 100원, 귤은 150원이고 소비세는 10%일 때 지불 금액은 얼마인가?
계산 그래프 신경망의 역전파
x
+ x
x
2
100
3
150
200
450
650
1.1
715
• Computational Graph에서 계산을 왼쪽에서 오른쪽으로 진행하는 것을 순전파 (forward propagation)이라고 한다.
• 계산 그래프에서 종착점에서 출발점으로 미분을 계산하는 것을 역전파(backward propagation)이라고 한다.
 Computational Graph 의 장점
• 국소적 계산 : 전체에서 어떻게 진행되는 상관없이 자신과 관계된 정보만으로 계산
(예, 가운데 + Node의 경우 여러 식품을 구매하더라도 해당 노드는 더하는 계산만 하면 됨.
• 중간 계산 결과를 모두 보관할 수 있다.
• 역전파를 통해 ‘미분’을 효율적으로 계산할 수 있다.
 사과 가격, 귤 가격, 사과 개수, 귤 개수, 소비세에 대한 지불 금액의 미분을 계산할 수 있다.
Computational Graph의 역전파 계산시는 미분을 계산하여 앞쪽 노드로 전파한다.
 Backward Propagation의 계산 절차
예) 𝑦 = 𝑓(𝑥) 의 역전파
f
x
E
𝝏𝒚
𝝏𝒙
E
• 역전파의 계산 절차는 신호 E에 노드의 편미분
𝝏𝒚
𝝏𝒙
을 곱한 후 다음 노드로
전달하는 것
• 𝑦 = 𝑥2
인 경우,
𝝏𝒚
𝝏𝒙
= 2𝑥 가 된다.
y
계산 그래프 신경망의 역전파
합성함수와 Chain Rule(연쇄법칙)이란 합성 함수의 미분의 성질이며, 합성 함수의 미분은 합성함수를 구성하는 각 함수의 미분의 곱이다.
 합성 함수의 예 ( 𝒛 = (𝒙 + 𝒚) 𝟐
)
순전파 계산
• 𝑧 = 𝑡2
• 𝑡 = 𝑥 + 𝑦
+ **2
x
y
t z
•
𝝏𝒛
𝝏𝒛
𝝏𝒛
𝝏𝒕
𝝏𝒕
𝝏𝒙
=
𝝏𝒛
𝝏𝒕
𝝏𝒕
𝝏𝒙
=
𝝏𝒛
𝝏𝒙
즉, x에 대한 z의 미분, 즉 역전파는 연쇄법칙의 원리와 같다.
𝝏𝒛
𝝏𝒛
= 𝟏
𝝏𝒛
𝝏𝒛
𝝏𝒛
𝝏𝒕
역전파 계산
•
𝝏𝒛
𝝏𝒙
=
𝝏𝒛
𝝏𝒕
𝝏𝒕
𝝏𝒙
•
𝝏𝒛
𝝏𝒕
= 𝟐𝒕 이고
𝝏𝒛
𝝏𝒙
= 𝟏 임으로
𝝏𝒛
𝝏𝒙
= 𝟐𝒕 ∗ 𝟏 = 𝟐 𝒙 + 𝒚 가 된다.
계산 그래프 신경망의 역전파
덧셈노드와 곱셈노드의 역전파를 예를 통해서 확인해 본다.
 덧셈 노드 ( 𝒛 = 𝒙 + 𝒚 )
•
𝝏𝒛
𝝏𝒙
= 𝟏 이고
𝝏𝒛
𝝏𝒚
= 𝟏 이다
+
x
y
z
𝝏𝑳
𝝏𝒛
𝝏𝑳
𝝏𝒛
은 상류에서 전해진 미분 값
+
10
5
15
𝟏. 𝟑
역전파 계산
• 만약 상류에서 1.3이 흘러오면 다음 노드
로 1.3을 전달한다.
 곱셈 노드 ( 𝒛 = 𝒙𝒚 )
•
𝝏𝒛
𝝏𝒙
= 𝒚 이고
𝝏𝒛
𝝏𝒚
= 𝒙 이다
+
x
y
z
𝝏𝑳
𝝏𝒛
𝝏𝑳
𝝏𝒛
은 상류에서 전해진 미분 값
+
10
5
50
𝟏. 𝟑
역전파 계산
• 만약 상류에서 1.3이 흘러오면 한 군데는
6.5 (1.3x5) 다른 하나는 13 (1.3x10)을 보
낸다.
• 곱셈 역 전파 계산 시 순방향 입력 신호
값이 필요함.
계산 그래프 신경망의 역전파
사과 귤 쇼핑의 역전파를 계산해 보자
 순전파
사과 2개, 귤 3개를 사는데 사과는 1개 100원, 귤은 150원이고 소비세는 10%일 때 지불 금액은 얼마인가?
x
+ x
x
2
100
3
150
200
450
650
1.1
715
 역전파
x
+ x
x
110
2.2
165
3.3
1.1
1.1
1.1
650
1
계산 그래프 신경망의 역전파
사과 가격이 1원 오르면 최종 금액은 2.2원 오른다.
계산 그래프의 구현
 덧셈 노드와 곱셈 노드의 구현
계산 그래프 신경망의 역전파
class AddLayer:
def __init__(self):
pass # 아무것도 하지말 것.
def forward(self, x, y):
return x+y
def backward(self, dout):
dx = dout * 1
dy = dout * 1
return dx, dy
class MulLayer:
def __init__(self):
self.x = None # 순전파의 입력값을 유지
self.y = None
def forward(self, x, y):
self.x = x
self.y = y
return x*y
def backward(self, dout):
dx = dout*self.y
dy = dout*self.x
return dx, dy
계산 그래프의 구현
 사과 귤 쇼핑에 적용
계산 그래프 신경망의 역전파
# 입력값
applePrice = 100
orangePrice = 150
appleCnt = 2
orangeCnt = 3
tax = 1.1
# 계산그래프 설계
appleLayer = MulLayer()
orangeLayer = MulLayer()
sumLayer = AddLayer()
taxLayer = MulLayer()
# 순전파
appleTotal = appleLayer.forward(applePrice, appleCnt)
orangeTotal = orangeLayer.forward(orangePrice, orangeCnt)
total = sumLayer.forward(appleTotal, orangeTotal)
totalWithTax = taxLayer.forward(total, tax)
print(appleTotal, orangeTotal, total, totalWithTax)
# 역전파
dout = 1
dsum, dtax = taxLayer.backward(dout)
dappleTotal, dorangeTotal = sumLayer.backward(dsum)
dapplePrice, dappleCnt = appleLayer.backward(dappleTotal)
dorangePrice, dorangeCnt = orangeLayer.backward(dorangeTotal)
print(dsum, dtax, dappleTotal, dorangeTotal)
print(dapplePrice, dappleCnt, dorangePrice, dorangeCnt) 200 450 650 715.0000000000001
1.1 650 1.1 1.1
2.2 110.00000000000001 3.3000000000000003 165.0
Back Propagation 알고리즘
 역 전파 알고리즘 (Back propagation algorithm)
• Deep Learning의 대표적인 지도학습 알고리즘.
• 신경망 매개변수의 기울기를 수치미분을 통해서 구한다면 계산 시간이 매우 오래 걸린다.
• 학습된 출력 값과 실제 값과의 차이인 손실의 역전파를 통해 가중치를 구한다. (Backward propagation of errors)
• 전파된 오차를 이용하여 가중치를 조정한다.
• 역전파 알고리즘은 매개변수의 기울기를 효율적으로 계산하는 방법이다.
• Back propagation 알고리즘은 Gradient descent rule과 결합되어 인공신경망 학습 알고리즘으로 많이 이용된다.
• 딥러닝 오픈 프레임워크에는 역 전파 알고리즘이 구현되어 있다.
역전파 알고리즘 신경망의 역전파
• 출력층의 오차 : 지도학습 데이터의 정답과 출력층의 출력 값의 차이
• 은닉층의 오차 : 출력층의 오차가 가중치를 고려하여 역방향으로 전달
• 델타(𝜹)규칙 : 어떤 입력 노드가 출력 노드의 오차에 기여했다면, 두 노드의 연결 가중치는 오차에 비례해 조절한다.
• 델타(𝜹) : 델타는 활성함수의 도함수(derivatives)를 이용해 계산..
역전파 알고리즘 신경망의 역전파
Back Propagation 알고리즘 (Cont’d)
 역 전파 알고리즘 (Back propagation algorithm)
신경망의 계층을 깊게 만들면 역 전파 알고리즘으로 심층 신경망을 학습 시킬 때 어려움을 겪는다.
 Vanishing Gradient (기울기 소멸) 문제
• 역 전파 알고리즘으로 학습시킬 때 앞쪽의 은닉층으로 오차가 거의 전달 안됨 (즉, 학습이 잘 안됨)
학습 거의 안됨 학습 잘 됨
• 은닉층 활성화 함수로 ReLU 함수를 사용하면 Sigmoid보다 빠르고 Vanishing Gradient 문제가 적어진다.
 Over-fitting (과적합) 문제
• 신경망이 깊어지면 복잡한 모델이 되어 과적합에 취약
• Dropout / Batch Normalization 기법으로 해결
 많은 계산량 문제
• 신경망이 깊어지면 가중치가 기하급수적으로 증가되고, 학습 데이터도 많이 필요하고, 계산량이 급증함.
• GPU의 활용과 배치 정규화(Batch Normalization, 2015년) 등의 알고리즘으로 개선
역전파 알고리즘 신경망의 역전파
• forward propagation
• backward propagation
ReLU 계층을 하나의 클래스로 구현
 ReLU (활성화 함수)
𝒚 =
𝒙 (𝒙 > 𝟎)
𝟎 (𝒙 ≤ 𝟎)
𝝏𝒚
𝝏𝒙
=
𝟏 (𝒙 > 𝟎)
𝟎 (𝒙 ≤ 𝟎)
ReLU
𝒙 𝒚
𝝏𝑳
𝝏𝒚
𝝏𝑳
𝝏𝒚
ReLU
𝒙 𝒚
𝝏𝑳
𝝏𝒚
𝟎
[ 𝒙 > 𝟎 인 경우]
[ 𝒙 ≤ 𝟎인 경우]
 구현 코드
계층별 구현 신경망의 역전파
import numpy as np
class Relu:
def __init__(self):
self.mask = None
def forward(self, x):
self.mask = (x <= 0)
out = x.copy()
out[self.mask] = 0
return out
def backward(self, dout):
dout[self.mask] = 0
dx = dout
return dx
relu = Relu()
x = np.array([[1.1, -0.3],[-1.4,3.1]])
print("입력값 : n" , x)
print("순전파 : n" , relu.forward(x))
print("마스크 : n" , relu.mask)
dout = np.array([[0.1, 0.2],[0.3, 0.4]])
print("손실값 : n" , dout)
print("역전파 : n" , relu.backward(dout))
입력값 :
[[ 1.1 -0.3]
[-1.4 3.1]]
순전파 :
[[1.1 0. ]
[0. 3.1]]
마스크 :
[[False True]
[ True False]]
손실값 :
[[0.1 0.2]
[0.3 0.4]]
역전파 :
[[0.1 0. ]
[0. 0.4]]
• 순전파시 mask를 만들어 저장
• 역전파시 mask를 활용하여 True 인 곳에 0으로 전파
• forward propagation
• backward propagation
Sigmoid 계층을 하나의 클래스로 구현 (backward 공식 도출 과정은 생략)
 Sigmoid (활성화 함수)
𝒚 =
𝟏
𝟏 + 𝒆−𝒙
𝝏𝒚
𝝏𝒙
= 𝒚(𝟏 − 𝒚)
Sigmoid
𝒙 𝒚
𝝏𝑳
𝝏𝒚
𝝏𝑳
𝝏𝒚
𝒚(𝟏 − 𝒚)
 구현 코드
계층별 구현 신경망의 역전파
 역전파는 순전파의 출력만으로 계산 가능
import numpy as np
class Sigmoid:
def __init__(self):
self.out = None
def forward(self, x):
out = 1 / (1 + np.exp(-x))
self.out = out
return out
def backward(self, dout):
dx = dout * self.out * (1.0 - self.out)
return dx
sigmoid = Sigmoid()
x = np.array([[1.1, -0.3],[-1.4,3.1]])
print("입력값 : n" , x)
print("순전파 : n" , sigmoid.forward(x))
dout = np.array([[0.1, 0.2],[0.3, 0.4]])
print("손실값 : n" , dout)
print("역전파 : n" , sigmoid.backward(dout))
입력값 :
[[ 1.1 -0.3]
[-1.4 3.1]]
순전파 :
[[0.75026011 0.42555748]
[0.19781611 0.95689275]]
손실값 :
[[0.1 0.2]
[0.3 0.4]]
역전파 :
[[0.01873699 0.04889166]
[0.04760547 0.01649961]]
• 순전파의 출력을 out 에 보관
• 역전파 계산 시 out 값을 활용하여 계산
• forward propagation
Affine 계층을 하나의 클래스로 구현 (backward 계산과정은 생략)
 Affine 변환 : 신경망 순전파시 수행하는 행렬의 내적
dot
𝑿 (N,2)
𝒀
𝝏𝑳
𝝏𝒀
+
• backward propagation
𝑾 (2,3)
𝑿 ∙ 𝑾
𝑩 (3,)
dot +
𝝏𝑳
𝝏𝒀
𝝏𝑳
𝝏𝑩
=
𝝏𝑳
𝝏𝒀
의 첫 번째 축(axis=0)의 합
𝝏𝑳
𝝏𝑾
= 𝑿 𝑻
∙
𝝏𝑳
𝝏𝒀
𝝏𝑳
𝝏𝑿
=
𝝏𝑳
𝝏𝒀
∙ 𝑾 𝑻
𝑾 𝑻
는 𝑾의 전치 행렬이다.
𝑾 =
1 2 3
4 5 6
이면
𝑾 𝑻
=
1 4
2 5
3 6
이다
계층별 구현 신경망의 역전파
(N,3) (N,3)
(N,3)(N,3)
(3)
(2,3)
(N,3)
(2,N)(N,3)
(N,3)(3,2)(N,2)
 배치처리 가능
 구현 코드
import numpy as np
class Affine:
def __init__(self, W, b):
self.W = W
self.b = b
self.x = None
self.dW = None
self.db = None
def forward(self, x):
self.x = x
out = np.dot(x, self.W) + self.b
return out
def backward(self, dout):
dx = np.dot(dout, self.W.T)
self.dW = np.dot(self.x.T, dout)
self.db = np.sum(dout, axis=0)
return dx
W = np.arange(1,7).reshape(2,3)
b = np.zeros(3)
affine = Affine(W,b)
X = np.arange(1,5).reshape(2,2)
print("--- 순전파 ---")
print(X)
print(W)
print(b)
print(affine.forward(X))
print("--- 역전파 ---")
dout = np.arange(1,7).reshape(2,3)
print(dout)
print(affine.backward(dout))
print(affine.dW)
print(affine.db)
--- 순전파 ---
[[1 2]
[3 4]]
[[1 2 3]
[4 5 6]]
[0. 0. 0.]
[[ 9. 12. 15.]
[19. 26. 33.]]
--- 역전파 ---
[[1 2 3]
[4 5 6]]
[[14 32]
[32 77]]
[[13 17 21]
[18 24 30]]
[5 7 9]
• 간소화된 Softmax-with-Loss 의 계산 그래프
Softmax-with-Loss 계층을 하나의 클래스로 구현 (backward 계산과정은 생략)
 Softmax 함수와 Cross Entropy 함수를 같이 구현
𝒂 𝟏
 구현 코드
import numpy as np
from MyLib.functions import softmax, cross_entropy_error
class SoftmaxWithLoss:
def __init__(self):
self.loss = None
self.y = None # Softmax 출력
self.t = None # 정답레이블 (One-Hot 인코딩)
def forward(self, x, t):
self.t = t
self.y = softmax(x)
self.loss = cross_entropy_error(self.y, self.t)
return self.loss
def backward(self, dout=1):
batchSize = self.t.shape[0]
dx = (self.y - self.t) / batchSize
return dx
softmaxloss = SoftmaxWithLoss()
x = np.array([0.3, 0.2, 0.5])
t = np.array([0.0, 1.0, 0.0])
print(softmaxloss.forward(x, t))
print(softmaxloss.backward())
x = np.array([0.1, 0.9, 0.0])
t = np.array([0.0, 1.0, 0.0])
print(softmaxloss.forward(x, t))
print(softmaxloss.backward())
𝒚 𝟏 − 𝒕 𝟏
3개 분류로 가정
𝒂 𝟏, 𝒂 𝟐, 𝒂 𝟑 는 Softmax 계층의 입력
𝒚 𝟏, 𝒚 𝟐, 𝒚 𝟑 는 Softmax 계층의 출력 (정규화, 합계가 1)
𝒕 𝟏, 𝒕 𝟐, 𝒕 𝟑 는 정답 레이블
𝑳 은 비용함수 값 (손실)
역전파의 결과 : 𝒚 𝟏 − 𝒕 𝟏, 𝒚 𝟐 − 𝒕 𝟐, 𝒚 𝟑 − 𝒕 𝟑
Softmax
Cross
Entropy
Error
𝒂 𝟐
𝒚 𝟐 − 𝒕 𝟐
𝒂 𝟑
𝒚 𝟑 − 𝒕 𝟑
𝒚 𝟏
𝒚 𝟐
𝒚 𝟑
𝑳
𝟏
𝒕 𝟏
𝒕 𝟐
𝒕 𝟑
• Softmax 계층은 학습 시에는 활용하지만 추론 시에는 활용
하지 않는다.
• 회귀 목적의 신경망에서는 항등함수의 손실함수로 평균제곱
오차를 활용한다.
계층별 구현 신경망의 역전파
1.23983106084446
[ 0.10662435 -0.23685563 0.13023128]
0.61836901210598
[ 0.08070286 -0.15372582 0.07302296]
 오차크기에 따라 전파되는 크기도 차이가 남
MINST를 위한 신경망 설계
 MNIST를 위한 신경망 설계 (이전과 동일)
• 입력층 : 784개 (이미지 크기가 28x28 픽셀임으로)
• 은닉층 : 100개
• 출력층 : 10개 (0에서 9로 분류함으로)
• 은닉층의 활성화 함수는 Sigmoid 함수를 활용한다.
• 출력층의 활성화 함수는 Softmax 함수를 활용한다.
• 가중치는 정규분포로 초기화한다.
• 손실함수는 교차엔트로피함수를 사용한다.
• 학습률은 0.1로 한다
MNIST 적용
𝒙 𝟏
𝒙 𝟐
𝒛 𝟏𝟎𝟎
(𝟏)
𝒛 𝟏
(𝟏) 𝒚 𝟏
𝒚 𝟏𝟎
𝟏
𝟏
w
b
𝒙 𝟕𝟖𝟒
…
…
…
X W1 W2  Y
784 784 x 100 100 x 10 10
일치 일치 일치
신경망의 역전파
 MNIST를 위한 신경망 설계 (조정내역)
• 계층별 구현을 적용하여 신경망을 구현한다.
• 경사하강법 적용 시 수치계산이 아닌 역전파를 활용한다.
• 학습은 미니배치로 100개를 추출하여 학습하고
10,000번 반복 학습한다.
MINST 구현 1 – 2층 신경망 클래스 구현
MNIST 적용
import numpy as np
import MyLib.layers as ml
from collections import OrderedDict
class MnistNet:
def __init__(self, inputSize, hiddenSize, outputSize, weightInitStd=0.01):
self.params = {}
self.params['W1'] = weightInitStd * np.random.randn(inputSize, hiddenSize)
self.params['W2'] = weightInitStd * np.random.randn(hiddenSize, outputSize)
self.params['b1'] = np.zeros(hiddenSize)
self.params['b2'] = np.zeros(outputSize)
# 계층생성
self.layers = OrderedDict()
self.layers['Affine1'] = ml.Affine(self.params['W1'], self.params['b1'])
self.layers['Relu1'] = ml.Relu()
self.layers['Affine2'] = ml.Affine(self.params['W2'], self.params['b2'])
self.lastLayer = ml.SoftmaxWithLoss()
def predict(self, x):
for layer in self.layers.values():
x = layer.forward(x)
return x
def loss(self, x, t):
y = self.predict(x)
return self.lastLayer.forward(y, t)
def accuracy(self, x, t):
y = self.predict(x)
y = np.argmax(y, axis=1)
t = np.argmax(t, axis=1)
accuracy = np.sum(y==t) / float(x.shape[0])
return accuracy
신경망의 역전파
다음 장에 계속…
MINST 구현 1 – 2층 신경망 클래스 구현
MNIST 적용
def grad(self, x, t):
#순전파
self.loss(x, t)
#역전파
dout = 1
dout = self.lastLayer.backward(dout)
layers = list(self.layers.values())
layers.reverse()
for layer in layers:
dout = layer.backward(dout)
grad = {}
grad['W1'] = self.layers['Affine1'].dW
grad['b1'] = self.layers['Affine1'].db
grad['W2'] = self.layers['Affine2'].dW
grad['b2'] = self.layers['Affine2'].db
return grad
신경망의 역전파
MINST 구현 2 – 미니배치 학습 구현
MNIST 적용
import numpy as np
from MyLib.mnist import load_mnist
from Backward.MnistNet import MnistNet
#1.데이터 확보 및 전처리
(trainImg, trainLbl),(testImg, testLbl) = load_mnist(one_hot_label=True)
#2.신경망 초기화
network = MnistNet(784, 50, 10)
#3.하이퍼파라미터 초기화
itersNum = 10000
learningRate = 0.1
batchSize = 100
trainSize = trainImg.shape[0]
#4.학습진행현황 기록변수
trainLossList = []
print("-- 학습 시작 --")
# 학습
for i in range(itersNum):
# 미니배치
miniBatchMask = np.random.choice(trainSize, batchSize)
trainImgBatch = trainImg[miniBatchMask]
trainLblBatch = trainLbl[miniBatchMask]
# 기울기계산
grad = network.grad(trainImgBatch, trainLblBatch)
# 매개변수갱신
for key in ('W1', 'W2', 'b1', 'b2'):
network.params[key] -= learningRate*grad[key]
# 손실합수의 값 기록
loss = network.loss(trainImgBatch, trainLblBatch)
trainLossList.append(loss)
print("iteration %d 손실 값: %f" % (i, loss))
print("-- 학습 종료 --")
-- 학습 시작 --
iteration 0 : 2.29192863536
iteration 1 : 2.29489284268
iteration 2 : 2.28903658939
… 결과 생략 …
iteration 9997 손실 값: 0.040860
iteration 9998 손실 값: 0.071562
iteration 9999 손실 값: 0.046348
-- 학습 종료 –
 학습에 하루가 소요
신경망의 역전파
실습 신경망의 역전파
 다음 계산 그래프의 역전파 값을 구한다.
#1 – Computational Graph 의 계산
실습 신경망의 역전파
 다음 계산 그래프의 순전파와 역전파를 구현하고 값을 확인한다.
#2 – Computational Graph 의 구현
VI. 학습 관련 기술
신경망 학습의 목적은 매개변수(가중치, 편향)의 최적값을 찾는 것이다. 이를 최적화(Optimization)이라고 한다.
 최적화 알고리즘
• 신경망 가중치, 편향의 최적화는 매우 어려운 작업. 수식으로 단번에 최솟값을 구할 수 있는 방법이 없다.
• 지금껏 최적화는 기울기를 이용해 기울어진 방향으로 매개변수 값을 갱신하는 일을 반복해서 최적의 값으로 다가감.
(SGD, Stochastic Gradient Descent)
• SGD는 문제에 따라 비효율적일 때가 있는데 이를 보완하는 최적화 기법이 나오고 있다.
최적화 (Optimization) 학습 관련 기술
 최적화 구현의 모듈화
• 딥러닝 구현 시 최적화를 담당하는 클래스를 분리해서 구현하면 기능을 모듈화 할 수 있다.
• 대부분의 딥러닝 프레임워크는 다양한 최적화 기법을 구현해 제공하며, 원하는 기법으로 쉽게 바꿀 수 있게 되어 있다.
# Gradient 계산
grad = network.numericalGradient(trainImgBatch, trainLblBatch)
# 가중치, 편향 갱신
for key in ('W1', 'W2', 'b1', 'b2'):
network.params[key] -= learningRate*grad[key]
[ MNIST 에서 Mini-batch SGD를 활용한 최적화 ]
class SGD:
def __init__(self, lr=0.01):
self.lr = lr
def update(self, params, grads):
for key in params.keys():
params[key] -= self.lr * grads[key]
class Momentum: …
class Nesterov: …
class AdaGrad:…
…
[ Optimizer 구현 ]
optimizers["SGD"] = SGD(lr=0.95)
…
for i in range(max_iterations):
…
grads = networks[key].gradient(x_batch, t_batch)
optimizers[key].update(networks[key].params, grads)
[ Optimizer 호출 ]
다양한 최적화 알고리즘을 비교해보자
 Gradient descent optimization algorithms
이름 특징
SGD (Stochastic Gradient
Descent
• 기울어진 방향(기울기)으로 일정 거리(학습률)만 이동
• 단순하지만 문제에 따라 비효율적이다.
Momentum
• 기울기 방향으로 물체가 가속되는 관성의 원리 적용. 속도 (Velocity)라는 변수가 추가
• 한 스텝전의 기울기를 일정한 비율로 반영하여 새로 계산된 기울기와 합해서 사용
Nesterov accelerated
gradient (NAG)
• Momentum에서 발전된 방법으로 momentum보다 더 공격적으로 속도(Velocity)를 활용
• 현재 가중치에서 기울기를 계산하기 전에, 먼저 학습했던 만큼 한 번 더 가본 상태로 계산
AdaGrad
• 처음에는 학습률을 크게 하다가 조금씩 작게 학습하는 방법
• 전체 학습률을 조정하는 것이 아니라, 각각의 매개변수에 맞는 학습률을 조정.
• 과거의 기울기를 제곱해서 계속 더해감으로 학습이 진행될수록 갱신 강도가 약해짐
Adadelta • AdaGrad의 extension. 그러나 생각보다 잘 작동 안 함.
RMSprop
• AdaGrad의 단점은 무한히 학습하다 보면 순간 갱신량이 0이 되어 학습이 안됨.
• 이를 개선하여 RMSprop은 먼 과거의 기울기는 잊고 새로운 기울기 정보를 크게 반영
Adam (Adaptive Moment
Estimation)
• Momentum과 AdaGrad의 이점을 조합.
• 학습률, 1차 momentum용 계수, 2차 momentum용 계수의 3개의 hyper paramter 설정
최적화 (Optimization) 학습 관련 기술
어떤 알고리즘을 선택해야 하는가?
 최적화 기법 비교
• 모든 문제에 항상 뛰어난 기법은 없다. 즉, 문제 별로 최적화 기법을 선택 적용해야 한다.
• 학습률 등의 하이퍼 파라미터의 설정 등에 따라 최적화 알고리즘의 결과도 달라딘다.
• 대체적으로 SGD, Momentum, Adagrad, Adam 등을 사용한다.
• Gradient descent optimization algorithms에 대해 자세히 알고 싶으면 아래를 참조한다.
http://sebastianruder.com/optimizing-gradient-descent/
최적화 (Optimization) 학습 관련 기술
신경망 학습에 가중치의 초기값 선정은 매우 중요하다.
 Weight Decay 기법 (가중치 감소 기법)
• 가중치를 작게 만들어 Overfitting을 억제하는 방법
• 가중치를 작게 만들려면 초기값을 최대한 작은 값에서 시작
• 초기값 선정 : 정규분포에서 Random하게 선택되는 값을 0.01배 한 작은 값 (표준편차가 0.01인 정규분포)
가중치 초기값 선정
class MyTwoLayerNet:
def __init__(self, inputSize, hiddenSize, outputSize, weightInitStd = 0.01):
self.params = {}
self.params['W1'] = weightInitStd * np.random.randn(inputSize, hiddenSize)
self.params['W2'] = weightInitStd * np.random.randn(hiddenSize, outputSize)
self.params['b1'] = np.zeros(hiddenSize)
self.params['b2'] = np.zeros(outputSize)
[ MNIST 의 2층 신경망의 가중치 초기값 코드 ]
• 가중치의 초기값을 0으로 만들면?
 학습이 되지 않는다. 순전파시 가중치가 모두 0이면 두 번째 층의 노드에 모두 같은 값이 전달 됨
• 표준편차가 1인 정규분포를 사용해서 초기값 선정 (1*np.random.randn(inputSize, hiddenSize)) 시?
 활성화함수로 Sigmoid 함수를 사용한다면 활성화 값이 0과 1로 치우쳐 분포됨.
 기울기 소실 (Gradient Vanishing)문제 발생 : 층이 깊을수록 학습이 안됨.
• 표준편차가 0.01인 정규분포를 사용해서 초기값 선정 (0.01*np.random.randn(inputSize, hiddenSize)) 시?
 활성화함수 값이 거의 같은 값을 출력함으로 층이 깊어지는 의미가 없음.
“각 층의 활성화 값은 적당히 고루 분포되어야 학습이 잘 이루어진다.”
학습 관련 기술
Sigmoid 함수나 tanh 함수를 활성화 함수로 이용할 때 Xavier 초기값을 하고 ReLU인 경우 He 초기값을 이용한다.
 Xavier (사비에르) 초기값
• Xavier Glorot와 Yoshua Bengio 논문에서 권장하는 가중치 초기값.
• 활성화 함수로 Sigmoid 함수나 tanh함수를 사용할 때 적용
• 일반적인 딥러닝 프레임워크가 표준적으로 이용
• 초기값의 표준편차가
1
𝑛
인 정규분포로 초기화 (여기서 n은 앞 층 노드의 수)
가중치 초기값 선정
 He 초기값
• Kaiming He 가 발견한 초기 값.
• 활성화 함수가 ReLU일 때 적용
• 초기값의 표준편차가
2
𝑛
인 정규분포로 초기화
(여기서 n은 앞 층 노드의 수)
[ ReLU 활성화 함수를 이용한 5층 신경망에서 MNIST 테스트 ]
학습 관련 기술
배치 정규화 (Batch Normalization)은 각 층에서의 활성화 값이 적당히 분포되도록 조정하는 것이다.
 Batch Normalization
• 데이터 분포를 정규화하는 배치 정규화 (Batch Norm)계층을 신경망에 삽입 (2015년도에 제안)
배치 정규화
• Batch Normalization의 장점
 학습 속도의 개선
 가중치 초기값에 크게 의존하지 않음.
 Overfitting을 억제한다. (Dropout 등의 필요성 감소)
• Batch Normalization에 대해 좀 더 자세한 내용
 https://shuuki4.wordpress.com/2016/01/13/batch-
normalization-%EC%84%A4%EB%AA%85-%EB%B0%8F-
%EA%B5%AC%ED%98%84/
Affine ReLU
Batch
Norm
(BN)
Affine ReLU
Batch
Norm
(BN)
Affine ReLU
Batch
Norm
(BN)
[ Batch Normalization 수식 ]
“Batch Normalization의 경우 Deep Learning의 필수적인 기법이 되어가고 있다.”
학습 관련 기술
Over-fitting이란 신경망이 훈련 데이터에 지나치게 적응되어 실 데이터에는 성능이 안 나오는 것이다.
 신경망에서의 Over-fitting
과적합 대응
• 신경망에서의 Overfitting은 다음 경우에 자주 발생함
 매개변수가 많고 표현력이 높은 경우 (층이 많은 경우)
 훈련 데이터가 적은 경우
• 과적합 대응 방법 : Weight Decay, Dropout 등
“Dropout의 경우 효과는 좋지만 학습 속도가 다소 느려진다.”
“Batch Normalization의 경우 가중치 초기화 문제와 과적합 문제를 동시에 해결할 수 있다.”
 Weight Decay (가중치 감소)
• 원래 over-fitting은 가중치 값이 커서 발생하는 경우가 많다.
• 가중치를 감소시키면 over-fitting이 억제되는 효과가 있다.
• 하지만 신경망 모델이 복잡해지면 이걸로 불충분하다.
 Dropout Algorithm
• 2012년 Hinton 교수가 제안한 것으로 과적합 문제를 개선.
• 신경망 학습 시 임의의 노드 몇 개를 생략해 학습하고, 다음 계산 시 또 다른 노드를 생략하고 학습
• 일반적으로 입력층에서 20%~25% 정도, 은닉층에서 50% 정도의 노드를 생략한다.
• 효과
“학습 시 학습 데이터에 의해 연결의 weight가 동조화 되는 현상 (co-adaptation)을 피한다.”
* Co-Adaptation : 노이즈에서 발생한 잘못된 특성이 모든 노드에 전파되어 의미 있는 특성을 선별하는데 부정적인 영향을 미치는 것
[ Dropout Algorithm ]
학습 관련 기술
과적합을 피하는 다양한 방법 중 검중(Validation) 기법을 알아본다.
 학습 데이터의 일부를 따로 떼어 내어 학습이 아닌 검증용으로 사용하는 기법
보유하고 있는 데이터셋을 Training set (50%~60%), Validation set (20%~25%), Test set (20%~25%) 으로 구분
(1) Training set 을 가지고 예측 혹은 분류 모델을 훈련시키고
(2) Validation set을 가지고서 훈련 중인 모델이 혹시 과적합(over-fitting)인지 검증, 감시를 하면서 Hyper Parameter를 선정
(3) Test set을 사용해서 최종 모델(final model)에 대해서 평가
 교차 검증 (Cross Validation)
학습 데이터를 용도별로 나누는 것은 같은데, 처음에 나눠진 데이터를 그대로 사용하는 것이 아니라 중간중간에 서로 다시 나눠 줌
과적합 대응 학습 관련 기술
#1 – 경사하강법 비교하기
 myoptimizercomparenaive.py 소스와 실행결과 확인
실습 학습 관련 기술
파이썬으로 익히는 딥러닝 기본 (18년)
파이썬으로 익히는 딥러닝 기본 (18년)

More Related Content

What's hot

Getting Started with Azure AutoML
Getting Started with Azure AutoMLGetting Started with Azure AutoML
Getting Started with Azure AutoMLVivek Raja P S
 
220206 transformer interpretability beyond attention visualization
220206 transformer interpretability beyond attention visualization220206 transformer interpretability beyond attention visualization
220206 transformer interpretability beyond attention visualizationtaeseon ryu
 
Visualization of Deep Learning
Visualization of Deep LearningVisualization of Deep Learning
Visualization of Deep LearningYaminiAlapati1
 
Introduction to 3D Computer Vision and Differentiable Rendering
Introduction to 3D Computer Vision and Differentiable RenderingIntroduction to 3D Computer Vision and Differentiable Rendering
Introduction to 3D Computer Vision and Differentiable RenderingPreferred Networks
 
Neural Network from Scratch in Python
Neural Network from Scratch in PythonNeural Network from Scratch in Python
Neural Network from Scratch in PythonDhirajk7
 
기계학습 / 딥러닝이란 무엇인가
기계학습 / 딥러닝이란 무엇인가기계학습 / 딥러닝이란 무엇인가
기계학습 / 딥러닝이란 무엇인가Yongha Kim
 
Resnet.pptx
Resnet.pptxResnet.pptx
Resnet.pptxYanhuaSi
 
Convolutional Neural Networks (CNNs)
Convolutional Neural Networks (CNNs)Convolutional Neural Networks (CNNs)
Convolutional Neural Networks (CNNs)Hajar Bouchriha
 
Convolutional neural network
Convolutional neural network Convolutional neural network
Convolutional neural network Yan Xu
 
파이썬(Python) 으로 나만의 딥러닝 API 만들기 강좌 (Feat. AutoAI )
파이썬(Python) 으로 나만의 딥러닝 API 만들기 강좌 (Feat. AutoAI ) 파이썬(Python) 으로 나만의 딥러닝 API 만들기 강좌 (Feat. AutoAI )
파이썬(Python) 으로 나만의 딥러닝 API 만들기 강좌 (Feat. AutoAI ) Yunho Maeng
 
Reinforcement Learning, Application and Q-Learning
Reinforcement Learning, Application and Q-LearningReinforcement Learning, Application and Q-Learning
Reinforcement Learning, Application and Q-LearningAbdullah al Mamun
 
Machine learning - AI
Machine learning - AIMachine learning - AI
Machine learning - AIWitekio
 
What Is Deep Learning? | Introduction to Deep Learning | Deep Learning Tutori...
What Is Deep Learning? | Introduction to Deep Learning | Deep Learning Tutori...What Is Deep Learning? | Introduction to Deep Learning | Deep Learning Tutori...
What Is Deep Learning? | Introduction to Deep Learning | Deep Learning Tutori...Simplilearn
 
Introduction to Machine learning ppt
Introduction to Machine learning pptIntroduction to Machine learning ppt
Introduction to Machine learning pptshubhamshirke12
 
Machine Learning - Convolutional Neural Network
Machine Learning - Convolutional Neural NetworkMachine Learning - Convolutional Neural Network
Machine Learning - Convolutional Neural NetworkRichard Kuo
 
Feature Extraction
Feature ExtractionFeature Extraction
Feature Extractionskylian
 
GUI based handwritten digit recognition using CNN
GUI based handwritten digit recognition using CNNGUI based handwritten digit recognition using CNN
GUI based handwritten digit recognition using CNNAbhishek Tiwari
 
딥러닝 논문읽기 efficient netv2 논문리뷰
딥러닝 논문읽기 efficient netv2  논문리뷰딥러닝 논문읽기 efficient netv2  논문리뷰
딥러닝 논문읽기 efficient netv2 논문리뷰taeseon ryu
 
Relational knowledge distillation
Relational knowledge distillationRelational knowledge distillation
Relational knowledge distillationNAVER Engineering
 

What's hot (20)

Getting Started with Azure AutoML
Getting Started with Azure AutoMLGetting Started with Azure AutoML
Getting Started with Azure AutoML
 
220206 transformer interpretability beyond attention visualization
220206 transformer interpretability beyond attention visualization220206 transformer interpretability beyond attention visualization
220206 transformer interpretability beyond attention visualization
 
파이썬으로 익히는 딥러닝
파이썬으로 익히는 딥러닝파이썬으로 익히는 딥러닝
파이썬으로 익히는 딥러닝
 
Visualization of Deep Learning
Visualization of Deep LearningVisualization of Deep Learning
Visualization of Deep Learning
 
Introduction to 3D Computer Vision and Differentiable Rendering
Introduction to 3D Computer Vision and Differentiable RenderingIntroduction to 3D Computer Vision and Differentiable Rendering
Introduction to 3D Computer Vision and Differentiable Rendering
 
Neural Network from Scratch in Python
Neural Network from Scratch in PythonNeural Network from Scratch in Python
Neural Network from Scratch in Python
 
기계학습 / 딥러닝이란 무엇인가
기계학습 / 딥러닝이란 무엇인가기계학습 / 딥러닝이란 무엇인가
기계학습 / 딥러닝이란 무엇인가
 
Resnet.pptx
Resnet.pptxResnet.pptx
Resnet.pptx
 
Convolutional Neural Networks (CNNs)
Convolutional Neural Networks (CNNs)Convolutional Neural Networks (CNNs)
Convolutional Neural Networks (CNNs)
 
Convolutional neural network
Convolutional neural network Convolutional neural network
Convolutional neural network
 
파이썬(Python) 으로 나만의 딥러닝 API 만들기 강좌 (Feat. AutoAI )
파이썬(Python) 으로 나만의 딥러닝 API 만들기 강좌 (Feat. AutoAI ) 파이썬(Python) 으로 나만의 딥러닝 API 만들기 강좌 (Feat. AutoAI )
파이썬(Python) 으로 나만의 딥러닝 API 만들기 강좌 (Feat. AutoAI )
 
Reinforcement Learning, Application and Q-Learning
Reinforcement Learning, Application and Q-LearningReinforcement Learning, Application and Q-Learning
Reinforcement Learning, Application and Q-Learning
 
Machine learning - AI
Machine learning - AIMachine learning - AI
Machine learning - AI
 
What Is Deep Learning? | Introduction to Deep Learning | Deep Learning Tutori...
What Is Deep Learning? | Introduction to Deep Learning | Deep Learning Tutori...What Is Deep Learning? | Introduction to Deep Learning | Deep Learning Tutori...
What Is Deep Learning? | Introduction to Deep Learning | Deep Learning Tutori...
 
Introduction to Machine learning ppt
Introduction to Machine learning pptIntroduction to Machine learning ppt
Introduction to Machine learning ppt
 
Machine Learning - Convolutional Neural Network
Machine Learning - Convolutional Neural NetworkMachine Learning - Convolutional Neural Network
Machine Learning - Convolutional Neural Network
 
Feature Extraction
Feature ExtractionFeature Extraction
Feature Extraction
 
GUI based handwritten digit recognition using CNN
GUI based handwritten digit recognition using CNNGUI based handwritten digit recognition using CNN
GUI based handwritten digit recognition using CNN
 
딥러닝 논문읽기 efficient netv2 논문리뷰
딥러닝 논문읽기 efficient netv2  논문리뷰딥러닝 논문읽기 efficient netv2  논문리뷰
딥러닝 논문읽기 efficient netv2 논문리뷰
 
Relational knowledge distillation
Relational knowledge distillationRelational knowledge distillation
Relational knowledge distillation
 

Similar to 파이썬으로 익히는 딥러닝 기본 (18년)

머신러닝 및 딥러닝 기초 (2020.01.07)
머신러닝 및 딥러닝 기초 (2020.01.07)머신러닝 및 딥러닝 기초 (2020.01.07)
머신러닝 및 딥러닝 기초 (2020.01.07)KYOYOON JUNG
 
Chapter 11 Practical Methodology
Chapter 11 Practical MethodologyChapter 11 Practical Methodology
Chapter 11 Practical MethodologyKyeongUkJang
 
Transfer learning usage
Transfer learning usageTransfer learning usage
Transfer learning usageTae Young Lee
 
PYCON KR 2017 - 구름이 하늘의 일이라면 (윤상웅)
PYCON KR 2017 - 구름이 하늘의 일이라면 (윤상웅)PYCON KR 2017 - 구름이 하늘의 일이라면 (윤상웅)
PYCON KR 2017 - 구름이 하늘의 일이라면 (윤상웅)Haezoom Inc.
 
머신러닝의 개념과 실습
머신러닝의 개념과 실습머신러닝의 개념과 실습
머신러닝의 개념과 실습Byoung-Hee Kim
 
한눈에 보는 머신러닝
한눈에 보는 머신러닝한눈에 보는 머신러닝
한눈에 보는 머신러닝주경 이
 
검색엔진에 적용된 딥러닝 모델 방법론
검색엔진에 적용된 딥러닝 모델 방법론검색엔진에 적용된 딥러닝 모델 방법론
검색엔진에 적용된 딥러닝 모델 방법론Tae Young Lee
 
딥러닝 세계에 입문하기 위반 분투
딥러닝 세계에 입문하기 위반 분투딥러닝 세계에 입문하기 위반 분투
딥러닝 세계에 입문하기 위반 분투Ubuntu Korea Community
 
Deep learning framework 제작
Deep learning framework 제작Deep learning framework 제작
Deep learning framework 제작Tae Young Lee
 
Deep Learning for AI (1)
Deep Learning for AI (1)Deep Learning for AI (1)
Deep Learning for AI (1)Dongheon Lee
 
스마트폰 위의 딥러닝
스마트폰 위의 딥러닝스마트폰 위의 딥러닝
스마트폰 위의 딥러닝NAVER Engineering
 
Things Data Scientists Should Keep in Mind
Things Data Scientists Should Keep in MindThings Data Scientists Should Keep in Mind
Things Data Scientists Should Keep in MindDataya Nolja
 
The bleeding edge of machine learning stream in 2017 - APAC ML/DS Community ...
The bleeding edge of  machine learning stream in 2017 - APAC ML/DS Community ...The bleeding edge of  machine learning stream in 2017 - APAC ML/DS Community ...
The bleeding edge of machine learning stream in 2017 - APAC ML/DS Community ...Jeongkyu Shin
 
what is deep learning?
what is deep learning? what is deep learning?
what is deep learning? PartPrime
 
Ch.5 machine learning basics
Ch.5  machine learning basicsCh.5  machine learning basics
Ch.5 machine learning basicsJinho Lee
 
KERIS 실험학교 연수(기초과정
KERIS 실험학교 연수(기초과정KERIS 실험학교 연수(기초과정
KERIS 실험학교 연수(기초과정Kwang-Hyun Park
 

Similar to 파이썬으로 익히는 딥러닝 기본 (18년) (20)

머신러닝 및 딥러닝 기초 (2020.01.07)
머신러닝 및 딥러닝 기초 (2020.01.07)머신러닝 및 딥러닝 기초 (2020.01.07)
머신러닝 및 딥러닝 기초 (2020.01.07)
 
Chapter 11 Practical Methodology
Chapter 11 Practical MethodologyChapter 11 Practical Methodology
Chapter 11 Practical Methodology
 
Transfer learning usage
Transfer learning usageTransfer learning usage
Transfer learning usage
 
PYCON KR 2017 - 구름이 하늘의 일이라면 (윤상웅)
PYCON KR 2017 - 구름이 하늘의 일이라면 (윤상웅)PYCON KR 2017 - 구름이 하늘의 일이라면 (윤상웅)
PYCON KR 2017 - 구름이 하늘의 일이라면 (윤상웅)
 
머신러닝의 개념과 실습
머신러닝의 개념과 실습머신러닝의 개념과 실습
머신러닝의 개념과 실습
 
한눈에 보는 머신러닝
한눈에 보는 머신러닝한눈에 보는 머신러닝
한눈에 보는 머신러닝
 
검색엔진에 적용된 딥러닝 모델 방법론
검색엔진에 적용된 딥러닝 모델 방법론검색엔진에 적용된 딥러닝 모델 방법론
검색엔진에 적용된 딥러닝 모델 방법론
 
딥러닝 세계에 입문하기 위반 분투
딥러닝 세계에 입문하기 위반 분투딥러닝 세계에 입문하기 위반 분투
딥러닝 세계에 입문하기 위반 분투
 
Deep learning framework 제작
Deep learning framework 제작Deep learning framework 제작
Deep learning framework 제작
 
Deep Learning for AI (1)
Deep Learning for AI (1)Deep Learning for AI (1)
Deep Learning for AI (1)
 
Technical Report on "Neuromarketing: Graph Transformer-based Consumer Prefere...
Technical Report on "Neuromarketing: Graph Transformer-based Consumer Prefere...Technical Report on "Neuromarketing: Graph Transformer-based Consumer Prefere...
Technical Report on "Neuromarketing: Graph Transformer-based Consumer Prefere...
 
스마트폰 위의 딥러닝
스마트폰 위의 딥러닝스마트폰 위의 딥러닝
스마트폰 위의 딥러닝
 
S.M.Lee, Invited Talk on "Machine Learning-based Anomaly Detection"
S.M.Lee, Invited Talk on "Machine Learning-based Anomaly Detection"S.M.Lee, Invited Talk on "Machine Learning-based Anomaly Detection"
S.M.Lee, Invited Talk on "Machine Learning-based Anomaly Detection"
 
Things Data Scientists Should Keep in Mind
Things Data Scientists Should Keep in MindThings Data Scientists Should Keep in Mind
Things Data Scientists Should Keep in Mind
 
The bleeding edge of machine learning stream in 2017 - APAC ML/DS Community ...
The bleeding edge of  machine learning stream in 2017 - APAC ML/DS Community ...The bleeding edge of  machine learning stream in 2017 - APAC ML/DS Community ...
The bleeding edge of machine learning stream in 2017 - APAC ML/DS Community ...
 
what is deep learning?
what is deep learning? what is deep learning?
what is deep learning?
 
Ch.5 machine learning basics
Ch.5  machine learning basicsCh.5  machine learning basics
Ch.5 machine learning basics
 
KERIS 실험학교 연수(기초과정
KERIS 실험학교 연수(기초과정KERIS 실험학교 연수(기초과정
KERIS 실험학교 연수(기초과정
 
AUTOML
AUTOMLAUTOML
AUTOML
 
Automl
AutomlAutoml
Automl
 

파이썬으로 익히는 딥러닝 기본 (18년)

  • 1. 파이썬으로 익히는 딥러닝 기본 (Python Deep Learning Basic) 2018. 7. 강병호수석
  • 2. I. 머신러닝 개요 II. 퍼셉트론의 이해 III. 신경망의 순전파 IV. 신경망의 학습 V. 신경망의 역전파 VI. 학습 관련 기술 Contents
  • 3. 작성자 소개  학력 • 1993년 숭실대학교 인공지능학과 입학 • 2000년 숭실대학교 컴퓨터학부 졸업  경력 • 2000년 SKC&C (현, SK주식회사) 입사 ~ • 국내 프로젝트 수행 • 2000년 ~ 2003년 SK Telecom Web Development • 2010년 ~ 2014년 SK Telecom Web Development • 2017년 ~ 2018년 인공지능 프로젝트 • 해외 프로젝트 수행 • 2003년 ~ 2004년 베트남 S Telecom 영업시스템 • 2005년 ~ 2009년 미국 Virgin Mobile USA 영업시스템 • 2009년 ~ 2010년 미국 Union Back 모바일 프로젝트 • 2015년 ~ 2016년 중국 SKC&C 중국법인 역량개발 총괄  기타 • 회사 사내 강사 (2012년~) • 자바, 스프링, 웹 개발, 인공지능 강의 수행 • 국가 자격증 문제 출제 위원 (Pilot, 2014년) • 한국소프트웨어기술협회(KOSTA) SW개발자 L4 자격 강병호 수석 medit74@sk.com
  • 6. 머신러닝의 정의 머신러닝 개요 Arthur Samuel은 1959년 처음으로 Machine Learning이라는 용어를 사용하였다.  Arthur Samuel (1959) 명시적으로 프로그램을 작성하지 않고 컴퓨터에 학습할 수 있는 능력을 부여하기 위한 연구 분야 “The field of study that gives computers the ability to learn without being explicitly programmed”  Machine Learning의 예 (y=3x) • 학습데이터 (1,3), (3,9), (4,12), (6,18) • 컴퓨터에 y=3x의 함수를 프로그래밍하지 않아도 앞의 학습데이터를 학습한 후 (8, ?) (10, ?)의 질문을 던져도 그 대답을 할 수 있게 만드는 것. 머신러닝, 데이터 마이닝과 무엇이 다를까? 분류, 예측, 군집 같은 기술, 모델, 알고리즘을 이용 데이터의 몰랐던 속성 발견에 집중 학습데이터 기반 예측에 집중 Machine Learning Data Mining
  • 7. 머신러닝의 정의 머신러닝 개요 Tom Mitchell은 1997년에 Machine Learning에 대해 재 정의를 하였다.  Tom Mitchell (Carnegie Mellon University, 1997) 만약 컴퓨터 프로그램이 특정한 태스크 T를 수행할 때 성능 P만큼 개선되는 경험 E를 보이면, 그 컴퓨터 프로그램은 태 스크 T와 성능 P에 대해 경험 E를 학습했다라고 할 수 있다. "A computer program is said to learn from experience E with respect to some class of tasks T and performance measure P, if its performance at tasks in T, as measured by P, improves with experience E."  문제) Suppose your email program watches which emails you do or do not mark as spam, and based on that learns how to better filter spam. What is the task T in this setting? ① Classifying emails as spam or not spam. ② Watching you label emails as spam or not spam. ③ The number (or fraction) of emails correctly classified as spam/not spam. T E P
  • 8. 머신러닝의 정의 머신러닝 개요 구글의 Yufeng은 2017년 Machine Learning를 심플하게 정의하였다.  “Using data to answer questions”  Data is the Key [From] https://towardsdatascience.com/what-is-machine-learning-8c6871016736
  • 9. 머신러닝의 정의 머신러닝 개요 순서나 이유를 명확하게 설명하지 못하는 일을 처리하기 위한 방법으로 기계 학습을 선택할 수 있다. 【 순차적 처리】 【 기계 학습 】  월별 매출 집계  종업원 개인 정보 관리  상품 재고 관리 Data Program 처리 결과 Data 학습모델 처리 결과  앞에 있는 과일을 보고 사과라고 인식한다.  오늘은 상대의 기분이 안 좋아 보인다.  한눈에 반해서 사랑에 빠진다.  Training Set Machine Learning이 학습 모델을 만들기 위해 사용하는 데이터  Model Machine Learning에서 구하려는 최종 결과물로 가설(Hypothesis)이라고도 부른다.  Inference / Prediction 학습된 모델을 실제 현장에서 사용하는 과정
  • 10. 머신러닝의 분류 머신러닝 개요 학습 데이터에 레이블(label)이 있는 경우와 그렇지 않은 경우에 따라 지도학습과 비지도학습으로 구분하고, 강화학습은 지도학 습 중 하나로 분류되거나 또는 독립적인 세 번째 머신러닝 모델로 분류하기도 한다. Types Tasks Algorithms 지도학습 (Supervised Learning) 분류 (Classification)  KNN : k Nearest Neighbor  SVM : Support Vector Machine  Decision Tree (의사결정 나무)  Logistic Regression 예측 (Prediction)  Linear Regression (선형 회귀) 비지도학습 (Unsupervised Learning) 군집 (Clustering)  K-Means Clustering  DBSCAN Clustering  Hierarchical Clustering (계층형 군집) 강화학습 (Reinforcement Learning)  MDP : Markov Decision Process  DQN : Deep Q-Network 기계 학습 시 고려해야 할 사항은?  그 방법으로 문제를 풀 수 있는가?  그 방법을 적용할 경우 성능에 문제가 없는가?  그 방법을 적용하기 위해 데이터를 충분히 준비할 수 있는가?
  • 11. 머신러닝 개요 지도학습 : Label이 있는 학습 데이터(Training Set)를 이용해서 학습. 【 지도학습의 Training Set의 예】 분류 (Classification) 회귀 (Regression) 결과 학습데이터의 레이블 중 하 나를 예측 (discrete) 연속된 값을 예측 (Continuous) 예제 학습데이터가 A, B, C 인 경 우 결과는 A, B, C 중 하나다. 예) 스팸메일 필터 결과 값이 어떠한 값도 나올 수 있다. 예) 주가 분석 예측  분류와 회귀의 비교 머신러닝의 분류
  • 12. 머신러닝 개요 비지도학습 : Label이 없는 학습 데이터(Training Set)를 이용해서 학습. 【 비지도학습의 Training Set의 예】 분류 (Classification) 군집 (Clustering) 공통점 입력된 데이터들이 어떤 형태로 그룹을 형성하는지가 관 심사 차이점 레이블이 있다. 레이블이 없다. 예) 의학 임상실험 환자군 구별 예) 구매자 유형 분류  분류와 군집의 비교 머신러닝의 분류
  • 13. 머신러닝 개요 강화학습 : 상과 벌이라는 보상을 통해 현재의 행위의 그 방향 혹은 반대 방향으로 행위를 강화화는 학습 방향  강화학습  시행착오 과정을 거쳐 학습하기 때문에 사람의 학습방식과 유사  Agent는 환경으로부터 상태를 관측하고 이에 따른 적절한 행동을 하 면 이 행동을 기준으로 환경으로부터 보상을 받는다.  관측 – 행동 – 보상의 상호작용을 반복하면서 환경으로부터 얻는 보상 을 최대화하는 태스크를 수행하기 위한 일련의 과정.  관측 – 행동 – 보상의 과정을 경험(Experience)이라고도 한다. 머신러닝의 분류
  • 14.  문제 : Wine or Beer?  다양한 Feature 들 중에 2개의 Feature로만 Wine과 Beer를 구분하는 문제  색 (빛의 파장) 및 알코올 함유량 (%) 머신러닝 개요 머신러닝 어플리케이션은 일련의 단계가 반복적인 프로세스를 통해서 구현된다. 머신러닝의 구현 Gathering data Data prepa ration Choosing a model Training Evaluation Parameter tuning Prediction [From] https://towardsdatascience.com/the-7-steps-of-machine-learning-2877d7e5548e
  • 15. 머신러닝 개요 Gathering Data는 Training Data를 확보하는 것이다. 머신러닝의 구현 * nm : nanometer Gathering data Data prepa ration Choosing a model Training Evaluation Parameter tuning Prediction
  • 16. 머신러닝 개요 Data Preparation은 Training Data를 적절한 곳에 적재하고 준비하는 것이다. 머신러닝의 구현 Gathering data Data prep aration Choosing a model Training Evaluation Parameter tuning Prediction  모든 Training Data를 합쳐 순서를 섞는다.  Training Data는 편향되지 않아야 한다.  학습 데이터가 나쁘면 실제 현장의 특성을 제대로 반영하지 못하므로, 학습 데이터 확보 시 실제 데이터의 특성이 잘 반영되고 편향되지 않 는 학습 데이터를 확보하는 것이 매우 중요함.  예) Beer 데이터가 Wine 데이터보다 월등히 많아서는 안된다.  Data는 적당히 분리하여 준비한다.  Training Set : 모델을 훈련 시키기 위한 data set  Validation Set : 모델이 예측할 때 사용하기 위한 data set  Test Set : 훈련이 끝난 모델을 평가하기 위한 data set  대부분 문제에서 Data는 조정되어 준비될 필요가 있다.  Normalization  Error Correction  Image Adjusting and Manipulation
  • 17.  모델의 선택  머신러닝 알고리즘, 딥러닝 알고리즘, 강화학습 알고리즘  이미지에 적합한 모델  텍스트나 음성같은 시계열 데이터에 적합한 모델  Wine or Beer 문제는 이진 분류 문제 임으로 Logistic Regression Model 이 적합 머신러닝 개요 이미 수년간 머신러닝 전문가에 의해 만들어진 모델에서 적합한 모델을 선택한다. 머신러닝의 구현 Gathering data Data prepa ration Choosing a model Training Evaluation Parameter tuning Prediction
  • 18. 머신러닝 개요 반복적인 Training을 통해 모델의 성능을 향상시킨다. 머신러닝의 구현 Gathering data Data prepa ration Choosing a model Training Evaluation Parameter tuning Prediction  Training  Use our data to incrementally improve our model’s ability to predict whether a given drink is wine or beer.  훈련용 데이터를 이용해 모델을 학습하고, 학습된 모델을 예측용 데이터를 이용해 테스트한 후, 발생한 오차를 모델 에 반영.  위 과정을 상당히 반복하여 최적의 모델을 만드는 것을 목 표로 함.
  • 19.  Evaluation  별도로 분리된 Evaluation 용 data set을 활용하여 훈련이 끝난 모델을 평가  일반적으로 평가용으로 활용되는 data set을 훈련용으로 사용하지는 않는다. 머신러닝 개요 학습이 끝난 모델을 평가하여 모델이 잘 완성되었는 지 평가 머신러닝의 구현 Gathering data Data prepa ration Choosing a model Training Evaluation Parameter tuning Prediction
  • 20.  Parameter Tuning  더 좋은 모델을 만들고, 더 효율적이 학습을 하기 위해 학습 시 활용되는 Parameter의 값을 조정한다.  얼마나 많이 학습 시킬 것인가?  한 번 학습 시 마다 발생하 오류를 어느 정도로 반영할 것인가? (“learning rate”)  모델의 초기값을 어떻게 설정할 것인가?  이렇게 사람이 조정하는 파라미터를 “hyperparameters”라고 함. 머신러닝 개요 좀 더 나은 학습을 위하여 파라미터를 조정한다. 머신러닝의 구현 Gathering data Data prepa ration Choosing a model Training Evaluation Parameter tuning Prediction
  • 21.  Inference / Prediction 머신러닝 개요 완성된 모델을 활용하여 추론(예측)한다. 머신러닝의 구현 Gathering data Data prepa ration Choosing a model Training Evaluation Parameter tuning Prediction
  • 22. 딥러닝 개요 머신러닝 개요 Deep Learning은 Machine Learning의 일종이고, Machine Learning은 인공지능의 일종이다.
  • 23. 딥러닝 개요 딥러닝이란 컴퓨터가 스스로 학습할 수 있게 하기 위해 인공 신경망을 기반으로 하는 기계 학습 기술  딥러닝이란? 인간의 신경망(Neural Network) 이론을 이용한 인공 신경망 (ANN, Artificial Neural Network)의 일종으로, 계층 구조 (Layer Structure)로 구성되면서 입력층(Input Layer)과 출력층(Output Layer) 사이에 하나 이상의 은닉층(Hidden Layer)을 가지고 있는 심층 신경망(DNN, Deep Neural Network) 이다. 머신러닝 개요
  • 24. 인공신경망(ANN)은 인간의 뇌 구조를 모방하여 모델링 한 수학적 모델이다.  신경세포 (Neuron, 뉴런) Neuron의 입력은 다수이고 출력은 하나이며, 여러 신경세포로부터 전달되어 온 신호들은 합산되어 출력된다. 합산된 값이 설정 값(Threshold) 이상이면 출력 신호가 생기고 이하이면 출력 신호가 없다. 생물 신경망 인공 신경망 세포체 (Cell Body) 노드 (Node) 수상돌기 (Dendrites) 입력 (Input) 축삭 (Axon) 출력 (Output)  연결 : Synapse - Weight 다수의 Neuron이 연결되어 의미 있는 작업을 하듯, 인공신경망의 경우도 노드들을 연결시켜 Layer를 만들고 연결 강 도는 가중치로 처리된다. 생물 신경망 인공 신경망 Synapse 가중치 (Weight) 딥러닝 개요 머신러닝 개요
  • 25. 딥러닝의 근간이 되는 시작된 인공신경망의 연구는 1950년대부터 시작되었다. Perceptron(1958) 1960 1970 1980 1990 2000 역전파 이론 (‘1981, ‘1986) • 폴 워보스가 74년에 적용, 81년에 발표 • 러멜하트, 제프리힌톤, 로날드윌리엄스가 역전파 학습모델 발표 (‘1986)  인공신경망 연구 활성화 다층 퍼셉트론 출현 (‘1968) 네오코그니트론(neocognitron) 모델 (‘1979) • 후쿠시마 쿠니히코가 발표 (일본) • 뇌가 시작정보를 처리하는 구조를 기반으로 모델 작성 • 현재 Convolution 신경망(CNN)과 매우 유사 순환신경망 (RNN, Recurrent Neural Network, ‘1992) • 장단기 기억법 (Long Short-Term Memory) 개발 (‘1991) : 출력증의 정보를 계속 메모리에 저장하여 역전파에 이용 • 순환신경망 개발 (‘1992) : 장단기 기억법을 개선 : 후에 심층신뢰망 (DBN, Deep Belief Network)에 영향 딥러닝 용어 등장 (‘2000) 손글씨 문자 인식 연구 (‘1998) • CNN을 활용하여 높은 정밀도의 손글씨 문자 인식 (LeCun 팀) 딥러닝 개요 머신러닝 개요
  • 26. 2000년대 초 빙하기를 거치지만 2006년 부터 딥러닝 문제가 해결되면서 딥러닝이 부활되었다. 2000 2010 2020 딥러닝 부활 (‘2006) • 심층신뢰망 (DBN)  제프리 힌튼, 사이먼 오신데로, 이-화이테가 심층신뢰망 발표  RBM(Restricted Boltzmann Machine)이라는 사전학습(Pre-Training) 이용 • Auto-Encoder  벤지오 팀이 발표, DNN을 최적화하는 사전학습(Pre-Training) 방법  사전 학습을 통해 가중치 초깃값을 정하면 DNN이라도 학습이 잘 됨 Dropout 알고리즘 (‘2012) • Dropout 알고리즘 : 학습 시 오버피팅(overfitting)을 줄임 • Sigmoid 형 함수 대신 ReLU 형 함수 사용 GPU를 이용한 연산 풍부한 데이터 오픈 소스 개발 프레임워크 최근 DNN 최적화 어려움 엄청난 계산량 머신러닝알고리즘 발전 딥러닝 빙하기 (2000~2005)  Deep Learning은 왜 주목 받는가? Difficulties 해결 방안 학습 DNN 학습이 잘 안 됨. Unsupervised Pre-Training를 통한 해결 계산량 학습이 많은 계산이 필요함 H/W의 발전 및 GPU 활용 성능 다른 Machine Learning Algorithm의 높은 성 능 Dropout 알고리즘 등으로 Machine Learning 대비 월등한 성능 딥러닝 개요 머신러닝 개요
  • 28. 1943년 워렌 맥컬록(McCulloch)과 월터 피츠(Pitts)는 생물학적 신경망 이론을 단순화 해서 최초로 인공신경망 이론을 제시.  TLU : 최초의 인공신경망 최초의 인공신경망은 생물학적 신경망을 단순화 해서 논리, 산술, 기호 연산을 구현할 수 있게 하였는데 이것을 TLU (Threshold Logic Unit)라고 정의했다. 𝒙 𝟏 𝒙 𝟐 Σ 𝜃 = 2 𝒚 McCulloch-Pitts 논문에 표현된 TLU  TLU를 AND 논리 연산에 적용한 예 입력 x1 입력 x2 출력 y 0 0 0 0 1 0 1 0 0 1 1 1 만약 𝜃=1이면 OR 연산이 적용된 TLU가 된다. 퍼셉트론이란? 퍼셉트론의 이해
  • 29. 1949년 Donald Hebb은 시냅스의 연결강도 조정을 위한 생리학적 학습 규칙을 모델링하여 가중치 개념을 도입 퍼셉트론이란? 퍼셉트론의 이해  헵의 학습 (Hebbian Learning)  생물학적 신경망에서 뉴런 사이에서 신호전달 시 반복적 또는 지속적으로 신호가 자극됨. 이 결과로 뉴런 A에서 뉴런 B로 가는 경로인 시냅스 연결이 강화된다.  Hebb은 이것이 신경 레벨의 일종의 학습/기억의 과정이라고 보고 인공신경망에 가중치 개념으로 도입했다.
  • 30. 퍼셉트론이란? 퍼셉트론의 이해 1957년 로젠블래트는 현재 딥러닝의 기원이 되는 퍼셉트론 이론을 발표함.  Perceptron 이란?  McCulloch-Pitts TLU 이론 + Hebb의 학습 이론을 기반으로 입력층과 출력층 만으로 구성되는 알고리즘  퍼셉트론은 다수의 신호를 입력으로 받아 하나의 신호로 출력  출력은 1과 0의 두 가지 값만 가질 수 있다.
  • 31. 퍼셉트론이란? 퍼셉트론의 이해 퍼셉트론의 동작원리를 수식으로 표현  입력으로 2개의 신호를 받는 퍼셉트론의 수식화 𝑦 = 0 (𝑤1 𝑥1 + 𝑤2 𝑥2 ≤ 𝜃) 1 (𝑤1 𝑥1 + 𝑤2 𝑥2 > 𝜃) 𝒙 𝟏 𝒙 𝟐 Σ 𝜃 𝒚 𝒘 𝟏 𝒘 𝟐
  • 32. 퍼셉트론의 구현 퍼셉트론의 이해 파이썬으로 입력층이 2개인 퍼셉트론을 구현  퍼셉트론을 함수로 구현 def perceptron(x1, x2, w1, w2, theta): affine = x1*w1 + x2*w2 if affine > theta: return 1 elif affine <= theta: return 0 𝑦 = 0 (𝑤1 𝑥1 + 𝑤2 𝑥2 ≤ 𝜃) 1 (𝑤1 𝑥1 + 𝑤2 𝑥2 > 𝜃)
  • 33. 퍼셉트론의 구현 퍼셉트론의 이해 AND 게이트와 OR 게이트로 동작하는 퍼셉트론  AND / OR 논리회로 진리표 (Truth-table) 입력 출력 (𝒚) 𝒙 𝟏 𝒙 𝟐 AND OR 0 0 0 0 1 0 0 1 0 1 0 1 1 1 1 1 𝒘 𝟏 𝒘 𝟐 𝜽 AND 0.5 0.5 0.7 AND 0.3 0.7 0.9 AND 1.0 1.0 1.1 OR 0.5 0.5 0.2 OR 0.8 0.4 0.3 OR 1.2 1.2 1.0  가중치와 임계 값을 조정하여 AND 퍼셉트론과 OR 퍼셉트론을 표현  이 예제에서 가중치와 임계 값은 사람이 임의로 지정.  기계학습은 이 값을 정하는 작업을 컴퓨터가 자동으로 하도록 하는 것.  즉, 신경망에서 학습이란 컴퓨터가 가중치를 정하는 것 이며, 사람은 망의 구조(모델)을 고민하고 학습 데이터 를 주는 일을 하는 것이다.  적당한 가중치를 알아내는 학습이 필요함 𝒙 𝟏 𝒙 𝟐 Σ 𝜃 𝒚 𝒘 𝟏 𝒘 𝟐
  • 34. 퍼셉트론의 구현 퍼셉트론의 이해 AND 게이트와 OR 게이트로 동작하는 퍼셉트론을 구현  AND 퍼셉트론과 OR 퍼셉트론을 함수로 구현 def perceptron(x1, x2, w1, w2, theta): affine = x1*w1 + x2*w2 if affine > theta: return 1 elif affine <= theta: return 0 def andPerceptron(x1, x2): w1, w2, theta = 0.5, 0.5, 0.7 return perceptron(x1, x2, w1, w2, theta) def orPerceptron(x1, x2): w1, w2, theta = 0.5, 0.5, 0.2 return perceptron(x1, x2, w1, w2, theta); print(andPerceptron(0,0)) print(andPerceptron(0,1)) print(andPerceptron(1,0)) print(andPerceptron(1,1)) print(orPerceptron(0,0)) print(orPerceptron(0,1)) print(orPerceptron(1,0)) print(orPerceptron(1,1)) 𝑦 = 0 (𝑤1 𝑥1 + 𝑤2 𝑥2 ≤ 𝜃) 1 (𝑤1 𝑥1 + 𝑤2 𝑥2 > 𝜃)
  • 35. 퍼셉트론의 구현 퍼셉트론의 이해 Bias (편향)을 도입하여 임계 값을 치환하면 같은 결과를 낼 수 있다. (𝜽를 −𝒃로 대체)  입력이 2개인 Perceptron (Bias의 도입) 𝑦 = 0 (𝑏 + 𝑤1 𝑥1 + 𝑤2 𝑥2 ≤ 0) 1 (𝑏 + 𝑤1 𝑥1 + 𝑤2 𝑥2 > 0) 𝒙 𝟏 𝒙 𝟐 Σ 𝒚 𝒘 𝟏 𝒘 𝟐 𝒃  Bias (편향) • 가중치 (𝒘 𝟏, 𝒘 𝟐)는 각 입력 신호가 결과에 주는 영향력을 조절하는 매개변수이고, Bias는 뉴런(Node)이 얼마나 쉽 게 활성화(여기에서는 결과를 1로 출력)하느냐를 조정하는 매개변수 임. • Bias의 사전적 의미로는 ‘한쪽으로 치우쳐 균형을 깬다’라는 의미를 담고 있다.
  • 36. 퍼셉트론의 구현 퍼셉트론의 이해 AND / OR 퍼셉트론에 Bias를 도입하여 NumPy를 이용해서 구현 import numpy as np def perceptron(X, W, bias): affine = np.sum(X*W) + bias if affine > 0: return 1 elif affine <= 0: return 0 def andPerceptron(X): W = np.array([0.5, 0.5]) bias = -0.7 return perceptron(X, W, bias) def orPerceptron(X): W = np.array([0.5, 0.5]) bias = -0.2 return perceptron(X, W, bias) print(andPerceptron(np.array([0,0]))) print(andPerceptron(np.array([0,1]))) print(andPerceptron(np.array([1,0]))) print(andPerceptron(np.array([1,1]))) print(orPerceptron(np.array([0,0]))) print(orPerceptron(np.array([0,1]))) print(orPerceptron(np.array([1,0]))) print(orPerceptron(np.array([1,1])))  NumPy를 이용한 Perceptron • 입력값과 가중치를 NumPy 1차원 배열 (ndarray) 로 표현 • ndarray의 산술 연산, 유니버설 함수를 이용해 입력 값과 가중치 연산을 단순화 • Bias 를 고려하여 And / Or 퍼셉트론을 구현 𝑦 = 0 (𝑏 + 𝑤1 𝑥1 + 𝑤2 𝑥2 ≤ 0) 1 (𝑏 + 𝑤1 𝑥1 + 𝑤2 𝑥2 > 0)
  • 37. 퍼셉트론의 구현 퍼셉트론의 이해 퍼셉트론의 시각화  Perceptron은 선형 분리 문제를 풀 수 있다. • 퍼셉트론을 시각화하면 직선으로 나뉜 두 영역을 만든다. • Perceptron은 학습이 진행될수록 선형 분리(linear boundary)선을 업데이트하면서 학습
  • 38. 퍼셉트론의 한계와 극복 퍼셉트론의 이해 XOR 게이트 구현의 한계  XOR 논리 회로는 퍼셉트론으로 구현할 수 없다. 입력 출력 (𝒚) 𝒙 𝟏 𝒙 𝟐 XOR 0 0 0 1 0 1 0 1 1 1 1 0  퍼셉트론의 Weight와 Bias의 값을 아무리 조정하더라도 XOR 퍼셉트론은 구현할 수가 없다.  퍼셉트론은 직선으로 나눈 영역만 표현할 수 있는데, XOR는 직선으로 영역을 나누어 표현할 수가 없다.  인공지능의 1차 겨울을 초래
  • 39. 퍼셉트론의 한계와 극복 퍼셉트론의 이해 다층 퍼셉트론 (multi layer perceptron)  XOR 게이트는 퍼셉트론에 은닉층을 하나 추가한 다층 퍼셉트론(2층 퍼셉트론)으로 구현할 수 있다. 입력 x1 입력 x2 은닉층 뉴런#1 은닉층 뉴런#2 y 0 0 0 0 0 0 1 0 1 1 1 0 0 1 1 1 1 1 1 0 [ 은닉층 뉴런#1은 AND연산, 은닉층 뉴런#2는 OR연산, 출력층은 XOR연산이 된다. ] 𝒙 𝟏 𝒙 𝟐 Σ|𝜃=1 𝒚 Σ|𝜃=1 Σ|𝜃=1 𝑤1 = −1.2 𝑤2 = 1.2 𝑤1 = 1.2 𝑤2 = 0.6 𝑤2 = 1.2 𝑤1 = 0.6 은닉층뉴런#1 은닉층뉴런#2  가중치를 갖는 층이 2개라 2층 퍼셉트론이라 한다.
  • 40. 퍼셉트론의 한계와 극복 퍼셉트론의 이해 은닉층 (Hidden Layer)  은닉층(Hidden Layer)의 역할  은닉층은 앞 단계에서 받은 데이터(신호)를 필터링해서 좀 더 구체화 한 후 다음 단계 층으로 전달  각 은닉층마다 몇 개의 뉴런(노드)이 최적인지는 문제에 따라 다르다.  Hidden Layer을 추가하면 선형분리 불가능 (linearly inseparable) 문제를 풀 수 있다.  하지만, 다층 퍼셉트론 발견 상시에는 다층 퍼셉트론을 학습시킬 수학적 모델이 없었다.  은닉층의 개수가 늘어나면 더욱 복잡한 문제를 풀 수 있으나 컴퓨터 계산량이 늘어난다.  신경망 층에 따라 Decision Boundary는 더 정확해 진다.
  • 41. 실습 퍼셉트론의 이해  NAND (Not AND) 퍼셉트론을 구현한다. • 입력값과 가중치의 연산은 NumPy를 활용한다. • Bias를 활용한다. • NAND 진리표는 다음과 같으며, 이를 구현하기 위해 Weight와 Bias를 적절히 초기화 한다. #1 – NAND 퍼셉트론 구현 입력 출력 (𝒚) 𝒙 𝟏 𝒙 𝟐 NAND 0 0 1 1 0 1 0 1 1 1 1 0
  • 42. 실습 퍼셉트론의 이해  아래 가중치와 임계 값을 이용하여 XOR 퍼셉트론을 구현한다. #2 – XOR 다층 퍼셉트론 구현 1 𝒙 𝟏 𝒙 𝟐 Σ|𝜃=1 𝒚 Σ|𝜃=1 Σ|𝜃=1 𝑤1 = −1.2 𝑤2 = 1.2 𝑤1 = 1.2 𝑤2 = 0.6 𝑤2 = 1.2 𝑤1 = 0.6 은닉층뉴런#1 은닉층뉴런#2
  • 43. 실습 퍼셉트론의 이해 #3 – XOR 다층 퍼셉트론 구현 2  기존 게이트의 조합으로 XOR 퍼셉트론을 구현한다. • XOR 게이트를 만드는 방법은 다양하다. • XOR 게이트는 AND, NAND, OR 게이트 조합으로도 만들 수 있다. • AND, NAND, OR 게이트의 아래와 같은 조합으로 XOR 퍼셉트론을 구현해 본다. NAND OR AND
  • 45. 신경망 신경망의 순전파 신경망의 순전파  신경망에서 정보의 흐름은 입력층  은닉층  출력증으로 진행되는데 이렇게 정보가 전방으로 전달되는 것을 순전파 (Feed forward)라고 한다  Input Layer (입력층)  입력 데이터를 받아들인다.  입력층의 노드(뉴런) 수는 입력 데이터의 특성 개수와 일치 한다.  Hidden Layer (은닉층)  은닉층의 뉴런 수와 은닉층의 개수는 신경망 설계자의 직관과 경험에 의존  은닉층의 뉴런 수가 너무 많으면 Overfitting이 발생, 너무 적으면 충분히 표현하지 못함.  은닉충의 개수가 너무 많으면 비효율적 (예, 은닉층 수를 2배로 늘리면 컴퓨팅 시간은 400% 증가하지만 정확성은 10%로 증가함)  Output Layer (출력층)  해결하고자 하는 문제의 성격 (예, 필기체 숫자를 인식한다면 0에서 9까지 10개 노드로 선정)
  • 46. 신경망 신경망의 순전파 뉴런(노드)의 처리 과정  뉴런의 처리 과정과 활성화 함수 (Activation Function)의 등장  좌측의 퍼셉트론의 처리과정을 표시한 식 𝑦 = 0 (𝑏 + 𝑤1 𝑥1 + 𝑤2 𝑥2 ≤ 0) 1 (𝑏 + 𝑤1 𝑥1 + 𝑤2 𝑥2 > 0)  이 식을 2개의 식으로 구분  가중치가 곱해진 입력 신호의 총합  입력 신호의 총합 입력해 결과를 내는 함수 𝑎 = 𝑏 + 𝑤1 𝑥1 + 𝑤2 𝑥2 𝑦 = ℎ(𝑎)  입력신호의 총합을 출력 신호로 변환하는 함수를 활성화 함수(Activation Function)라고 한다. * 퍼셉트론에서 활성화 함수는 입력 신호의 총합이 0보다 크면 1, 작거나 같으면 0을 출력하는 함수이다.
  • 47. 신경망 신경망의 순전파 활성화 함수의 이해  활성화 함수 (Activation Function)  Synapse는 전달된 전기 신호가 최소한의 자극 값을 초과하면 활성화되어 다음 뉴런으로 전기신호를 전달한다.  활성화 함수는 이것을 모방하여 값이 작을 때는 출력 값을 작은 값으로 막고, 일정한 값을 초과하면 출력 값이 커지 는 함수를 이용한다.  신경망에서 Node는 전달받은 데이터를 가중치를 고려해 합산한 값을 활성화 함수를 적용해 다음 층에 전달한다.  활성화 함수는 비선형 함수를 사용해야 한다.  계단 함수나 시그모이드 함수처럼 값이 하나의 직선으로 나오지 않는 함수를 비선형함수라 함.  선형 함수를 사용하면 신경망을 깊게 하는 의미가 없어짐 (선형 함수의 예 : 𝑓(𝑥)=𝑎𝑥+𝑏)
  • 48. 신경망의 순전파 활성화 함수의 종류  활성화 함수의 종류 함수 위치 설명 계단 함수 - 퍼셉트론에서 사용된 함수로 0 또는 1로 출력. 실제 신경망에선 사용되지 않음. Sigmoid 함수 은닉층 입력이 작으면 0에 가깝고 입력이 커지면 1에 가까워지는 함수로 실제 신경망에 자주 사용됨. tanh 함수 은닉층 쌍곡 탄젠트 (Hyperbolic Tangent)함수로 Sigmoid와 유사한 모양 ReLU 함수 은닉층 Rectified Linear Unit Function (렐루함수)로 최근 신경망에 주로 이용 PReLU 함수 은닉층 Parametric ReLU or leaky ReLU로 ReLU를 보완. Softmax 함수 출력층 출력층에서 사용되는 함수로 분류 문제를 해결할 때 사용 항등함수 출력층 입력을 그대로 출력하는 함수로 출력층에서 사용되는 함수 활성화 함수의 구현
  • 49. 활성화 함수의 구현 신경망의 순전파 계단 함수 구현하기  계단 함수의 식  계단 함수의 구현과 시각화 • 계단 함수는 NumPy의 배열(X)을 인수로 전달받았음. • X > 0 은 넘파이 배열과 스칼라의 연산 결과로 bool 배열이 생성됨. [False, … False, True, … True] • Y.astype 메서드로 배열 내 자료형을 np.int 형으로 변환 [0, … 0, 1, … 1] ℎ(𝑥) = 1 (𝑥 > 0) 0 (𝑥 ≤ 0) import numpy as np import matplotlib.pyplot as plt def step(X): Y = X > 0 return Y.astype(np.int) X = np.arange(-5, 5, 0.1) Y1 = step(X) plt.plot(X, Y1) plt.show()
  • 50. 활성화 함수의 구현 신경망의 순전파 Sigmoid 함수 구현하기  Sigmoid 함수의 식  Sigmod 함수의 구현과 시각화 • Sigmoid 함수의 결과는 항상 0과 1사이의 값을 가진다. ℎ(𝑥) = 1 1 + 𝑒−𝑥 import numpy as np import matplotlib.pyplot as plt def sigmoid(X): return 1/(1+np.exp(-X)) X = np.arange(-5, 5, 0.1) Y2 = sigmoid(X) plt.plot(X, Y2) plt.show()
  • 51. 활성화 함수의 구현 신경망의 순전파 ReLU 함수 구현하기  ReLU 함수의 식  ReLU 함수의 구현과 시각화 • ReLU 함수는 단순하여 학습 속도가 빠르고 학습이 잘 된다. ℎ(𝑥) = 𝑥 (𝑥 > 0) 0 (𝑥 ≤ 0) import numpy as np import matplotlib.pyplot as plt def relu(X): return np.maximum(0,X) X = np.arange(-5, 5, 0.1) Y3 = relu(X) plt.plot(X, Y3) plt.show()
  • 52. 신경망의 순전파 신경망에서의 행렬 곱 신경망 구현  신경망의 계산은 NumPy 배열이 제공하는 내적 연산을 이용하여 계산할 수 있다. 𝒙 𝟏 𝒙 𝟐 1 𝒚 𝟐 𝒚 𝟏 𝒚 𝟑 2 3 4 5 6 𝑥1 𝑥2 1 3 5 2 4 6 = 𝑦1 𝑦2 𝑦3 import numpy as np X = np.array([1, 2]) W = np.array([[1, 3, 5],[2, 4, 6]]) Y = np.dot(X, W) print(X) print(W) print(Y) [1 2] [[1 3 5] [2 4 6]] [ 5 11 17]
  • 53. 신경망의 순전파 3층 신경망의 설계 신경망 구현  3층 신경망의 구성 예 Layer Node 수 Node Shape Weight Shape Bias shape 계산 식 입력층 2 (2, ) 2x3 Matrix (3, ) 은닉층 (1st) = 활성화함수((입력층x가중치1) + 편향1) 은닉층 (1st) 3 (3, ) 3x2 Matrix (2, ) 은닉층 (2nd) = 활성화함수((은닉층 (1st) x가중치2) + 편향2) 은닉층 (2nd) 2 (2, ) 2x2 Matrix (2, ) 출력층 = 활성화함수((은닉층 (2nd) x가중치3) + 편향3) 출력층 2 (2, ) 𝒙 𝟏 𝒙 𝟐 𝒛 𝟐 (𝟏) 𝒛 𝟏 (𝟏) 𝒛 𝟑 (𝟏) 𝒛 𝟏 (𝟐) 𝒛 𝟐 (𝟐) 𝒚 𝟏 𝒚 𝟐 𝟏 𝟏 𝟏 w b • 은닉층의 활성화 함수는 Sigmoid 함수를 활용한다. • 출력층의 활성화 함수는 항등함수를 활용한다. • 가중치와 편향은 0.1 에서 0.9까지 임의의 값으로 지정한다. • 은닉층의 계산 결과를 출력한다.
  • 54. 신경망의 순전파 3층 신경망의 구현 신경망 구현  3층 신경망의 구현 코드 확인 import numpy as np def sigmoid(X): return 1/(1+np.exp(-X)) def identity(X): return X #1. 신경망초기화 W1 = np.array([[0.1, 0.3, 0.5],[0.2, 0.4, 0.6]]) W2 = np.array([[0.1, 0.4], [0.2, 0.5], [0.3, 0.6]]) W3 = np.array([[0.1, 0.3], [0.2, 0.4]]) b1 = np.array([0.1, 0.2, 0.3]) b2 = np.array([0.1, 0.2]) b3 = np.array([0.1, 0.2]) #2. 입력값 X = np.array([-2, 4]) print("입력층 : ", X) #3. 순전파 Z1 = sigmoid(np.dot(X, W1) + b1) print("1st 은닉층 : ", Z1) Z2 = sigmoid(np.dot(Z1, W2) + b2) print("2nd 은닉층 : ", Z2) Y = identity(np.dot(Z2, W3) + b3) print("출력층 : ", Y)
  • 55. 신경망의 순전파출력층 설계 신경망은 분류(Classification)와 회귀(Regression) 문제에 이용할 수 있으며, 목적에 맞게 출력층을 설계 해야 한다.  출력층의 활성화 함수 • 회귀 문제를 해결할 때  항등 함수 (identity function) 이용 • 분류 문제를 해결할 때  소프트맥스 함수 (softmax function) 이용 *단, 학습에만 이용하고 추론 시에는 생략함  항등 함수 (identity function) • 입력을 그대로 출력, 즉 입력과 출력이 같다.  분류 문제에서 출력층의 뉴런 수 정하기 • 분류하고 싶은 클래스 수로 설정 • 예를 들어 숫자 0에서 9까지 하나로 분류하고 싶으면 출력층의 뉴런을 10개로 설정
  • 56.  Softmax 함수는 출력 값으로 확률벡터를 얻을 수 있다.  출력 층에서의 Activation Function으로 자주 사용  인공신경망의 출력 값으로 확률 벡터를 얻고 싶을 때 사용 (출력 값의 해석을 용이하기 한다.)  분류문제에서 학습단계에 사용된 Softmax 함수는 추론 시에 생략한다. (출력 값이 큰 Node는 변하지 않음으로...) 분류 문제를 풀기 위해서 출력 층에서는 출력 값으로 확률벡터를 얻는 softmax 함수를 자주 사용한다.  Softmax 함수는 각 output node의 출력을 0~1로 제한  output node의 출력을 모두 합한 값은 항상 1  Softmax function의 수식  Softmax 함수 원리 𝒆 𝒚𝒊 : 지수함수 (exponential function) 신경망의 순전파출력층 설계
  • 57. Softmax 함수의 구현 신경망의 순전파출력층 설계  Softmax 함수의 식  Softmax 함수 구현 import numpy as np def softmax(X): expX = np.exp(X) sumExpX = np.sum(expX) return expX / sumExpX X = np.array([2.3, -0.9, 3.6]) Y = softmax(X) print(Y, np.sum(Y)) [0.21231157 0.00865429 0.77903414] 1.0
  • 58. Softmax 함수의 구현 (Cont’d) 신경망의 순전파출력층 설계  지수함수로 인한 Overflow 발생 가능  Softmax 함수 테스트  지수함수는 입력 값이 커질 수록 계산결과가 매우 높은 값 이 된다.  지수 함수 계산 결과가 매우 크면 overflow가 발생할 수 있다. import numpy as np def softmax(X): expX = np.exp(X) sumExpX = np.sum(expX) return expX / sumExpX X = np.array([990, 1000, 1010]) Y = softmax(X) print(Y, np.sum(Y)) RuntimeWarning: invalid value encountered in true_divide return expX / sumExpX [nan nan nan] nan
  • 59. Softmax 함수의 구현 (Cont’d) 신경망의 순전파출력층 설계  오버플로우 문제의 해결  Softmax 함수 변경  C 라는 임의의 정수를 분자 분모 양쪽에 곱한 후  C 를 지수함수 안으로 옮겨 log C 로 만든다.  log C 를 𝐶′ 로 대체  즉, • Softmax 함수는 임의의 정수를 더해도 결과는 바뀌지 않는다. • 오버플로우를 막을 목적으로 입력 신호 중 최대값을 찾아 빼준다. import numpy as np def softmax(X): expX = np.exp(X - np.max(X)) sumExpX = np.sum(expX) return expX / sumExpX X = np.array([990, 1000, 1010]) Y = softmax(X) print(Y, np.sum(Y)) [2.06106005e-09 4.53978686e-05 9.99954600e-01] 0.9999999999999999
  • 60. What is MNIST ?  MNIST(Mixed National Institute of Standards and Technology)는 Handwritten Digit Image 집합이다 • 기계학습 분야에서 사용되는 손글씨 숫자 이미지 데이터 셋 • 실험용 데이터로 자주 사용된다. • 0부터 9까지 숫자 이미지로 구성되어 있다 • 각 이미지가 실제 의미하는 숫자가 Label되어 있다. • 훈련 이미지가 6만장, 시험 이미지가 1만장으로 준비되어 있다. • 각 숫자는 가로, 세로 각각 28 픽셀 크기의 흑백 이미지이다 • https://en.wikipedia.org/wiki/MNIST_database 신경망의 순전파MNIST 적용
  • 61. MINST를 위한 신경망 설계  MNIST를 위한 신경망 설계 (3층 신경망) • 입력층 : 784개 (이미지 크기가 28x28 픽셀임으로) • 출력층 : 10개 (0에서 9로 분류함으로) • 첫번째 은닉층 : 50개 • 두번째 은닉층 : 100개 • 은닉층의 활성화 함수는 Sigmoid 함수를 활용한다. • 출력층의 활성화 함수는 Softmax 함수를 활용한다. 𝒙 𝟏 𝒙 𝟐 𝒛 𝟓𝟎 (𝟏) 𝒛 𝟏 (𝟏) 𝒛 𝟏𝟎𝟎 (𝟐) 𝒛 𝟏 (𝟐) 𝒛 𝟐 (𝟐) 𝒚 𝟏 𝒚 𝟏𝟎 𝟏 𝟏 𝟏 w b 𝒙 𝟕𝟖𝟒 … … … … X W1 W2 W3  Y 784 784 x 50 50 x 100 100 x 10 10 일치 일치 일치 일치 • 신경망 각 층의 배열 형상 추이 신경망의 순전파MNIST 적용
  • 62. MNIST 구현 1 - 데이터 준비  MNIST 데이터 준비 • 훈련데이터(6만장), 검증데이터(1만장) 다운로드 • 신경망 처리에 맞게 데이터 전처리 신경망의 순전파MNIST 적용 전처리 항목 적용 여부 설명 이미지 정규화 False 0~255의 픽셀 값을 0.0~1.0으로 변환 이미지 평탄화 True 28x28 배열을 784 배열로 평탄화 레이블 One Hot Encoding False 정답을 뜻하는 원소만 1이고 나머지는 0으로 표기법 예) [0,0,1,0,0,0,0,0,0,0] 는 2를 나타냄 import pickle import numpy as np import matplotlib.pyplot as plt import MyLib.mnist as mnist #1.데이터 확보 및 전처리 (trainImg, trainLbl),(testImg, testLbl) = mnist.load_mnist(normalize=False, flatten=True, one_hot_label=False) print(trainImg.shape) print(trainLbl.shape) print(testImg.shape) print(testLbl.shape) (60000, 784) (60000,) (10000, 784) (10000,) • load_mnist 함수는 http://yann.lecun.com/exdb/mnist/ 에서 데이터를 다운받아 /resources 경로에 pickle 형태(mnist.pkl)로 저장하는 함수
  • 63. MNIST 구현 2 – 신경망 구성  신경망 구성 • Weight와 Bias에 대한 값이 필요 • 설계된 신경망에 이미 학습된 가중치와 Bias를 저장한 파일(sample_weight.pkl)을 이용하여 신경망 구성 신경망의 순전파MNIST 적용 𝒙 𝟏 𝒙 𝟐 𝒛 𝟓𝟎 (𝟏) 𝒛 𝟏 (𝟏) 𝒛 𝟏𝟎𝟎 (𝟐) 𝒛 𝟏 (𝟐) 𝒛 𝟐 (𝟐) 𝒚 𝟏 𝒚 𝟏𝟎 𝟏 𝟏 𝟏 w b 𝒙 𝟕𝟖𝟒 … … … … X W1 W2 W3  Y 784 784 x 50 50 x 100 100 x 10 10 일치 일치 일치 일치 import pickle import numpy as np import matplotlib.pyplot as plt import MyLib.mnist as mnist #1.데이터 확보 및 전처리 ... #2.신경망 초기화 with open("../resources/sample_weight.pkl","rb") as f: network = pickle.load(f) W1, W2, W3 = network['W1'], network['W2'], network['W3'] b1, b2, b3 = network['b1'], network['b2'], network['b3'] print(W1.shape) print(W2.shape) print(W3.shape) print(b1.shape) print(b2.shape) print(b3.shape) (784, 50) (50, 100) (100, 10) (50,) (100,) (10,)
  • 64. MNIST 구현 3 – 순전파 및 추론  순전파 및 추론 • 3층 신경망에 훈련데이터를 순전파 (*활성화 함수로 Sigmoid와 Softmax를 활용) • Softmax 결과 가장 높은 확률을 가진 것, 즉 추론(예측) 결과와 훈련레이블을 비교 • 정확도(Accuracy) 측정 : 신경망이 예측한 결과 정답의 비율 확인을 통해 정확도 계산 신경망의 순전파MNIST 적용 import ... #1.데이터 확보 및 전처리 ... #2.신경망 초기화 ... #3.추론 def sigmoid(X): return 1/(1+np.exp(-X)) def softmax(X): expX = np.exp(X - np.max(X)) sumExpX = np.sum(expX) return expX / sumExpX accuracyCnt = 0 print(len(trainImg)) for idx in range(len(trainImg)): X = trainImg[idx] Z1 = sigmoid(np.dot(X, W1) + b1) Z2 = sigmoid(np.dot(Z1, W2) + b2) Y = softmax(np.dot(Z2, W3) + b3) p = np.argmax(Y) if p == trainLbl[idx]: accuracyCnt += 1 print(accuracyCnt) print(accuracyCnt / len(trainImg)) 60000 55511 0.9251833333333334
  • 65. MNIST 구현 4 - 이미지 시각화  Matplotlib를 이용하여 Image Plot 처리 • 훈련데이터 첫 번째 이미지를 출력하고 레이블을 확인한다. 신경망의 순전파MNIST 적용 import pickle import numpy as np import matplotlib.pyplot as plt import MyLib.mnist as mnist #1.데이터 확보 및 전처리 ... #2.신경망 초기화 ... #3.추론 ... #4.이미지 시각화 img = trainImg[0].reshape(28,28) lbl = trainLbl[0] plt.imshow(img, cmap="gray") plt.title("Label is %d" % lbl) plt.show()
  • 66. MINST 배치 처리 설계  이미지 여러 장을 한꺼번에 처리 (배치처리) 하기 • 100장을 한꺼번에 처리하는 경우의 형상  입력층은 100 x 784  첫번째 은닉층은 100 x 50  두번째 은닉층은 100 x 100  출력층은 100 x 10 • 배치 처리의 장점  수치 계산 라이브러리 대부분이 큰 배열을 효율적으로 처리하는 데 최적화 되어 있음.  데이터 I/O 횟수를 줄여, CPU, GPU가 계산에 집중 𝒙 𝟏 𝒙 𝟐 𝒛 𝟓𝟎 (𝟏) 𝒛 𝟏 (𝟏) 𝒛 𝟏𝟎𝟎 (𝟐) 𝒛 𝟏 (𝟐) 𝒛 𝟐 (𝟐) 𝒚 𝟏 𝒚 𝟏𝟎 𝟏 𝟏 𝟏 𝒙 𝟕𝟖𝟒 … … … … X W1 W2 W3  Y 100 x 784 784 x 50 50 x 100 100 x 10 100 x 10 일치 일치 일치 일치 • 신경망 각 층의 배열 형상 추이 (Bias와 Activation Function은 생략) 100x784 100x50 100x100 신경망의 순전파MNIST 적용
  • 67. MINST 배치 처리 구현 신경망의 순전파MNIST 적용 #3-2. 배치처리 처리 batchSize = 100 accuracyCnt = 0 print(len(trainImg)) for idx in range(0, len(trainImg), batchSize): X = trainImg[idx:idx+batchSize] Z1 = sigmoid(np.dot(X, W1) + b1) Z2 = sigmoid(np.dot(Z1, W2) + b2) Y = softmax(np.dot(Z2, W3) + b3) p = np.argmax(Y, axis=1) accuracyCnt += np.sum(p == trainLbl[idx:idx+batchSize]) print(accuracyCnt) print(accuracyCnt / len(trainImg))  100건씩 배치처리 구현
  • 68. 실습  다음 조건에 맞는 신경망을 구현한다. • 입력 층 10개, 은닉층 #1은 5개, 은닉층 #2는 8개, 출력층은 4개로 설계한다. • 가중치는 정규분포에서 Random으로 설정하고, 편향에 대한 가중치는 모두 0으로 세팅한다. • 은닉층에는 ReLU 함수로 구성하고, 출력층에서는 항등함수로 구현한다. • 은닉층의 출력 값을 확인하여 ReLU 함수의 적용 결과를 확인한다. #1 – 3층 신경망 설계 및 구현 신경망의 순전파 𝒙 𝟏 𝒙 𝟐 𝒛 𝟓 (𝟏) 𝒛 𝟏 (𝟏) 𝒛 𝟖 (𝟐) 𝒛 𝟏 (𝟐) 𝒛 𝟐 (𝟐) 𝒚 𝟏 𝒚 𝟒 𝟏 𝟏 𝟏 𝒙 𝟏𝟎 … … … …
  • 69. 실습  제공되는 2개의 파일을 이용하여 MNIST를 위한 신경망 구축 및 추론과정을 진행한다. • 제공되는 파일 : MyLib/mnist.py, resources/sample_weight.pkl • 한번에 100개씩 연산할 수 있도록 배치 처리를 한다. #2 – MNIST 구현하기 신경망의 순전파
  • 71. 신경망 학습의 개요 신경망의 학습 Widrow-Hoff Learning Rule  위드로-호프 학습규칙(Widrow-Hoff Learning Rule / Delta Rule) • 1960년 Bernard Widrow교수는 Perceptron과 유사한 ADALINE (Adaptive Linear Neuron) 단층 신경망 모델을 공개하 면서 위드로-호프 학습규칙(Widrow-Hoff Learning Rule) 즉, Delta Rule을 공개 • Delta Rule 이란 단층 신경망에서 적당한 가중치를 알아내기 위해 출력 층의 출력 값의 오차에 비례해 가중치를 조절 하는 것. • 델타 규칙은 신경망의 오차가 충분히 들어들 때 까지 학습 데이터를 반복해서 재 학습해야 한다. • 델타 규칙은 후에 역전파의 기본이론이 된다. [From] http://coolingoff.tistory.com/8
  • 72. 학습이란 신경망에서 원하는 결과를 얻기 위해 뉴런 사이의 적당한 가중치를 알아내는 것. 즉 가중치를 최적화 하는 것이다.  신경망 학습에 나오는 주요 개념 신경망 학습의 개요 신경망의 학습 용어 설명 훈련 데이터 Training Data 신경망 훈련에 사용하는 데이터. 시험 데이터 Test Data 훈련된 신경망 모델을 평가하는 데이터 오차 Loss / Cost 신경망 순전파 된 결과와 학습데이터의 레이블과의 차이 손실함수 / 비용함수 Loss / Cost Function 오차를 측정하기 위한 함수. 미니배치 학습 Mini Batch 훈련데이터 중 일부만 골라 학습을 수행하는 것 기울기 Gradient 모든 변수의 편미분을 벡터로 정리한 것. 신경망에서는 손실함수의 기울기 경사 하강법 Gradient Descent Method 기울기를 이용해 함수의 최소값을 찾는 방법, 가중치 최적화에 활용 학습률 Learning Rate 한 번의 학습에 얼마만큼 학습을 진행하는 지에 대한 설정 하이퍼파라미터 Hyper Parameter 학습률 같이 사람이 직접 설정해야 하는 매개변수 에폭 Epoch 학습 시 훈련 데이터를 모두 소진했을 때의 횟수 역전파 Back Propagation 역 방향으로 오차를 전파하면서 신경망 가중치와 편향을 최적화 과적합 Overfitting 훈련데이터에 지나치게 최적화된 상태로 실제 성능은 떨어짐
  • 73. 학습 데이터에 너무 지나치게 맞추다 보면 일반화 성능이 떨어지는 모델을 얻게 되는 현상을 과적합(Overfitting)이라고 한다.  Under Fitting 적정 수준의 학습을 하지 못하여 실제 성능이 떨어지는 경우  Normal Fitting (Generalized Fitting) 적정 수준의 학습으로 실제 적정한 일반화 수준을 나타냄. 기계 학습이 지향하는 수준.  Over Fitting 학습 데이터에 성능이 좋지만 실제 데이터에 관해 성능이 떨어짐. 특히 조심해야 함. 신경망 학습의 개요 신경망의 학습
  • 74. 손실 함수 / 비용 함수 신경망의 학습  손실 함수의 종류 비용함수란 신경망 학습에서 학습 데이터에 대한 오차를 측정하는 척도이다. 용어 설명 평균 제곱 오차 MSE (Mean Squared Error) 𝑬 = 𝟏 𝒌 (𝒚 𝒌 − 𝒕 𝒌) 𝟐 𝒌 교차 엔트로피 오차 CEE (Cross Entropy Error) 𝑬 = − 𝒕 𝒌 𝐥𝐨𝐠 𝒚 𝒌 𝒌  손실 함수를 사용하는 이유 • 신경망에서 가중치와 편향을 최적화 할 때 손실 함수의 값을 가증한 작게 하는 값을 찾는다. • 이 때 미분(기울기)을 활용하고, 그 미분 값을 단 서로 가중치와 편한 값을 서서히 갱신한다. [From] https://medium.com/data-science-group-iitr/loss-functions-and-optimization-algorithms-demystified-bb92daff331c
  • 75. 손실 함수 / 비용 함수 신경망의 학습 평균 제곱 오차 (Mean Squared Error, MSE) 𝑬 = 𝟏 𝒌 (𝒚 𝒌 − 𝒕 𝒌) 𝟐 𝒌 • 𝒚 𝒌 : 신경망의 출력 (신경망이 추정한 값) • 𝒕 𝒌 : 정답 레이블 • 𝒌 : 데이터의 차원 수 (MNIST에서는 0에서 9의 10개)  평균 제곱 오차 함수의 이해 • 각 원소의 출력과 정답 레이블의 차의 제곱에 평균을 취한 것 • One Hot Encoding 시 정답의 출력과 정답이 아닌 출력의 오차 를 모두 계산  평균 제곱 오차 식
  • 76. 손실 함수 / 비용 함수 신경망의 학습 평균 제곱 오차 (Mean Squared Error, MSE) import numpy as np def meanSquaredError(Y, T): return ((Y-T)**2).mean() # 정답은 '2' T = np.array([0, 0, 1, 0, 0, 0, 0, 0, 0, 0]) # '2'일 확률이 가장 높음. Y = np.array([0.1, 0.1, 0.6, 0, 0.1, 0.1, 0, 0, 0, 0]) print('정답인 경우 평균제곱오차 %f' % meanSquaredError(Y, T)) # '4'일 확률이 가장 높음. Y = np.array([0.1, 0.0, 0.1, 0, 0.7, 0.1, 0, 0, 0, 0]) print('오답인 경우 평균제곱오차 %f' % meanSquaredError(Y, T))  평균제곱오차의 구현 정답인 경우 평균제곱오차 0.020000 오답인 경우 평균제곱오차 0.132000
  • 77. 손실 함수 / 비용 함수 신경망의 학습 교차 엔트로피 오차 (Cross Entropy Error, CEE)  교차 엔트로피 오차 식 𝑬 = − 𝒕 𝒌 𝐥𝐨𝐠 𝒚 𝒌 𝒌 • 𝒚 𝒌 : 신경망의 출력 (0에서 1사이어야 한다) • 𝒕 𝒌 : 정답 레이블 (정답이 아닌 나머지는 𝑡 𝑘 가 0임으로 곱해도 0이 된다. • log : 밑이 e인 자연로그 (log 𝑒 𝒚 𝒌)  교차 엔트로피 오차 함수의 이해 • One Hot Encoding 시 정답이 아닌 출력 노드의 레이블(t) 값은 0임으로 정답일 때의 출력만 전체 손실 값을 정하는데 사용된다. • 자연로그 그래프  𝒙가 1일 때 𝒚는 0이 된다. (즉, loss = 0)  𝒙가 0에 가까워질수록 𝒚값은 점점 작아진다 (손실 값은 작아진다.)  𝒙가 0이면 𝒚는 –inf가 된다. (무한대) (손실 값은 오차가 클수록 커진다.) 자연로그의 그래프 (𝒚 = 𝐥𝐨𝐠 𝒙)
  • 78. 손실 함수 / 비용 함수 신경망의 학습 교차 엔트로피 오차 (Cross Entropy Error, CEE)  교차 엔트로피 오차의 구현 import numpy as np def crossEntropyError(Y, T): delta = 1e-7 return -np.sum(T*np.log(Y+delta)) # 정답은 '2' T = np.array([0, 0, 1, 0, 0, 0, 0, 0, 0, 0]) # '2'일 확률이 가장 높음. Y = np.array([0.1, 0.1, 0.6, 0, 0.1, 0.1, 0, 0, 0, 0]) print('정답인 경우 교차엔트로피 %f' % crossEntropyError(Y, T)) # '4'일 확률이 가장 높음. Y = np.array([0.1, 0.0, 0.1, 0, 0.7, 0.1, 0, 0, 0, 0]) print('오답인 경우 교차엔트로피 %f' % crossEntropyError(Y, T)) 정답인 경우 교차엔트로피 0.510825 오답인 경우 교차엔트로피 2.302584 • 교차 엔트로피 오차 구현 시 아주 작은 delta를 더해주는 이유 no.log(x) 계산 시 x 값이 0이면 –inf가 되어 계산이 불가능함으로 아주 작은 값을 더해서 0 이 되지 않도록 함.
  • 79. Mini-batch 학습이란 훈련 데이터로부터 일부만 골라서 학습을 수행하는 방식이다.  Mini-batch 학습이 필요한 이유 • 가중치를 조절하기 위한 비용함수의 계산은 모든 훈련데이터를 1회 마치고 비용 함수의 합을 구해야 한다. • 하지만 데이터가 많은 경우 (MNIST는 6만개) 손실함수 이렇게 구하는 건 비 현실적이다. • 이를 개선하기 위해 신경망 학습에서 훈련 데이터의 일부만 골라 학습하는 방법을 미니배치 학습이라고 한다. (즉, 표본을 뽑아 학습한다.) * 학습의 의미 : 손실함수를 계산하여 가중치 / 편향 조정을 한다. 손실 함수 / 비용 함수 신경망의 학습  미니배치 학습 시 교차 엔트로피 오차 식 𝑬 = − 𝟏 𝑵 𝒕 𝒏𝒌 𝐥𝐨𝐠 𝒚 𝒏𝒌 𝒌𝒏 • 1개의 손실함수를 N개로 확장하고 나누어 평균 손실 함수를 구함. • N은 미니배치 사이즈
  • 80. Mini-batch 학습 구현 – 훈련 데이터 추출  훈련 데이터에서 무작위로 10개 추출 • np.random.choice(60000,10) 은 0에서 60000 미만의 수 중에서 무작위로 10개를 추출 손실 함수 / 비용 함수 신경망의 학습 import numpy as np import MyLib.mnist as mnist #1.데이터 확보 및 전처리 (trainImg, trainLbl),(testImg, testLbl) = mnist.load_mnist(normalize=True, flatten=True, one_hot_label=True) print(trainImg.shape) print(trainLbl.shape) print(testImg.shape) print(testLbl.shape) batchSize = 10 trainSize = trainImg.shape[0] # 60000 batchMask = np.random.choice(trainSize, batchSize) print(batchMask) batchImg = trainImg[batchMask] batchLbl = trainLbl[batchMask] print(batchLbl) print(batchLbl.argmax(axis=1)) (60000, 784) (60000, 10) (10000, 784) (10000, 10) [12480 21053 50739 18430 45945 34843 24757 10842 28145 19516] [[0. 0. 0. 0. 0. 0. 1. 0. 0. 0.] [0. 0. 1. 0. 0. 0. 0. 0. 0. 0.] [0. 0. 0. 0. 0. 1. 0. 0. 0. 0.] [0. 0. 0. 0. 0. 0. 1. 0. 0. 0.] [0. 0. 0. 1. 0. 0. 0. 0. 0. 0.] [0. 0. 0. 0. 0. 1. 0. 0. 0. 0.] [0. 0. 0. 0. 0. 0. 0. 0. 1. 0.] [0. 1. 0. 0. 0. 0. 0. 0. 0. 0.] [0. 0. 0. 0. 0. 0. 0. 1. 0. 0.] [0. 1. 0. 0. 0. 0. 0. 0. 0. 0.]] [6 2 5 6 3 5 8 1 7 1]
  • 81. Mini-batch 학습 구현 – (미니) 배치용 교차 엔트로피 오차 함수 구하기  미니배치용 교차 엔트로피 함수 구현 손실 함수 / 비용 함수 신경망의 학습 import numpy as np def crossEntropyError(Y, T): delta = 1e-7 if Y.ndim == 1: T = T.reshape(1, T.size) Y = Y.reshape(1, Y.size) batchSize = Y.shape[0] return -np.sum(T*np.log(Y+delta)) / batchSize # return -np.sum(T*np.log(Y+delta)) # 정답은 '2' T = np.array([0, 0, 1, 0, 0, 0, 0, 0, 0, 0]) # '2'일 확률이 가장 높음. Y = np.array([0.1, 0.1, 0.6, 0, 0.1, 0.1, 0, 0, 0, 0]) print('정답인 경우 교차엔트로피 %f' % crossEntropyError(Y, T)) # '4'일 확률이 가장 높음. Y = np.array([0.1, 0.0, 0.1, 0, 0.7, 0.1, 0, 0, 0, 0]) print('오답인 경우 교차엔트로피 %f' % crossEntropyError(Y, T)) 정답인 경우 교차엔트로피 0.510825 오답인 경우 교차엔트로피 2.302584
  • 82. 미분과 기울기 신경망의 학습 미분은 특정 순간의 변화량이다.  미분 수식 𝒅𝒇(𝒙) 𝒅𝒙 = lim ℎ→𝟎 𝒇 𝒙 + 𝒉 − 𝒇(𝒙) 𝒉 • 𝒅𝒇(𝒙) 𝒅𝒙 : 미분, 즉 𝒙에 대한 𝒇(𝒙)의 변화량 • 𝒉 : 시간 • 𝒍𝒊𝒎 𝒉→𝟎 : 시간이 0에 가까워짐. • 자유 낙하 과정을 함수로 구할 수 있으며, 여기에 미분을 취하 면 순간 속도가 된다.  해석적 미분 • 고등학교 수학시간에 배운 미분 • 𝒚 = 𝒙 𝟐 의 해석적 미분은 𝒅𝒚 𝒅𝒙 = 𝟐𝒙 이다 즉, x=2일 때, 미분은 4가 된다. • 다항함수의 미분공식 [From] https://ko.wikipedia.org/wiki/%EB%AF%B8%EB%B6%84
  • 83. 미분과 기울기 신경망의 학습 미분 값은 접선의 기울기이다.  연속적이고 매끄러운 함수 (미분 가능한 함수)에서 특정 지점의 접선의 기울기는 그 점에서의 미분 값과 같다  점 Q가 점 P로 움직일 경우 직선 PQ의 기울기는 점 P 에서의 접선의 기울기와 같다.  접선의 기울기 [From] https://ko.wikipedia.org/wiki/%EB%AF%B8%EB%B6%84 미분 가능하지 않는 경우
  • 84. 미분과 기울기 신경망의 학습 수치 미분(Numerical Differentiation)은 근사치를 이용해서 계산하는 방법이다.  수치 미분 • 시간 h는 무한의 0으로 좁히는 것은 불가능 하다. • 따라서, 미분 값을 계산하기 위해 h에 아주 작은 값을 대입하여 계산하는 방법을 수치 미분이라 한다. • 시간을 나타내는 h에 가급적 낮은 값을 넣어야 하는데 너무 작은 값 (예, 0.00….1) 을 넣으면 컴퓨터 계 산에 문제가 발생한다. • 따라서 근사치를 이용하여 계산한다. h는 0.0001이 가장 좋다  중앙 차분을 이용한 수치 미분 • 수치 미분은 오차가 포함 • 오차를 줄이기 위해 x를 중심으로 전후의 차분을 계산하는 것을 중앙 차분 이라 한다. • 중앙 차분 수식 𝒅𝒇(𝒙) 𝒅𝒙 = 𝒇 𝒙 + 𝒉 − 𝒇(𝒙 − 𝒉) 𝟐𝒉
  • 85. 미분과 기울기 신경망의 학습 수치 미분(Numerical Differentiation)의 구현  𝐲 = 𝟎. 𝟎𝟏𝒙 𝟐 + 𝟎. 𝟏𝒙 의 미분 • 𝒅𝒚 𝒅𝒙 = 𝟎. 𝟎𝟏 ∗ 𝟐 ∗ 𝒙 + 𝟎. 𝟏 • x=5 일 때 미분 값은 0.2 • x=10 일 때 미분 값은 0.3 • 수치 미분으로 계산하더라도 값의 차는 거의 없다.  𝐲 = 𝟎. 𝟎𝟏𝒙 𝟐 + 𝟎. 𝟏𝒙 의 수치 미분 구현 import numpy as np import matplotlib.pyplot as plt def diff(f, x): h = 1e-4 return (f(x+h)-f(x-h))/(2*h) def sFunc1(x): return 0.01*x**2 +0.1*x X = np.arange(0, 20, 0.1) Y = sFunc1(X) plt.xlabel("x") plt.ylabel("f(x)") plt.plot(X, Y) plt.show() print(diff(sFunc1, 5)) print(diff(sFunc1, 10)) 0.1999999999990898 0.2999999999986347
  • 86. 미분과 기울기 신경망의 학습 편미분  편미분 정의 • 변수가 2개 이상인 함수를 미분할 때 미분 대상 변수 외에 나머지 변수를 상수처럼 고정시켜 미분하는 것.  편미분 구하기 • 함수 예) 𝑓 𝑥0, 𝑥1 = 𝑥0 2 + 𝑥1 2 • 𝒙 𝟎 = 𝟑, 𝒙 𝟏 = 𝟒 인 경우 편미분 𝝏𝒇 𝝏𝒙 𝟎 와 𝝏𝒇 𝝏𝒙 𝟏 는? • 𝝏𝒇 𝝏𝒙 𝟎 = 2𝑥0 즉 6이 된다. • 𝝏𝒇 𝝏𝒙 𝟏 = 2𝑥1 즉 8이 된다.
  • 87. 미분과 기울기 신경망의 학습 기울기(Gradient)  기울기 정의 • 모든 변수의 편미분을 벡터로 정리한 것. • 𝒇 𝒙 𝟎, 𝒙 𝟏 = 𝒙 𝟎 𝟐 + 𝒙 𝟏 𝟐 인 경우 기울기는 ( 𝝏𝒇 𝝏𝒙 𝟎 , 𝝏𝒇 𝝏𝒙 𝟏 )이다.  기울기 구하기 • 함수 예) 𝑓 𝑥0, 𝑥1 = 𝑥0 2 + 𝑥1 2 • 𝒙 𝟎 = 𝟑, 𝒙 𝟏 = 𝟒 인 경우 기울기 ∶ (𝟔, 𝟖) • 𝒙 𝟎 = 𝟎, 𝒙 𝟏 = 𝟐 인 경우 기울기 ∶ (𝟎, 𝟒) • 𝒙 𝟎 = 𝟑, 𝒙 𝟏 = 𝟎 인 경우 기울기 ∶ (𝟔, 𝟎)  기울기 시각화 • 기울기를 방향을 가진 벡터로 표시 • 기울기가 가리키는 쪽은 각 지점에서 함수의 출력 값을 가장 크게 줄이는 방향이다.
  • 88. 미분과 기울기 신경망의 학습 기울기(Gradient)라의 구현  𝒇 𝒙 𝟎, 𝒙 𝟏 = 𝒙 𝟎 𝟐 + 𝒙 𝟏 𝟐 인 함수의 기울기 구하기 import numpy as np def grad(f, x): h = 1e-4 grad = np.zeros_like(x) # x와 같은 형상의 배열 for idx in range(x.size): tmp = x[idx] x[idx] = tmp+h fx1 = f(x) # f(x+h) x[idx] = tmp-h fx2 = f(x) # f(x-h) grad[idx] = (fx1-fx2)/(2*h) x[idx] = tmp # 원래 값으로 return grad def sFunc2(x): return x[0]**2 + x[1]**2 print(grad(sFunc2, np.array([3.0, 4.0]))) print(grad(sFunc2, np.array([0.0, 2.0]))) print(grad(sFunc2, np.array([3.0, 0.0]))) [6. 8.] [0. 4.] [6. 0.]
  • 89. 신경망의 학습 기울기(Gradient) 신경망 적용  가중치 매개 변수에 대한 비용함수의 기울기 구하기 미분과 기울기  가중치 W, 손실 함수 L인 신경망의 기울기 • 2x3 형상의 가중치 𝑾의 형상과 기울기 𝝏𝑳 𝝏𝑾 의 형상은 아래와 같이 표시할 수 있다. 𝑾 = 𝒘 𝟏𝟏 𝒘 𝟏𝟐 𝒘 𝟏𝟑 𝒘 𝟐𝟏 𝒘 𝟐𝟐 𝒘 𝟐𝟑 𝝏𝑳 𝝏𝑾 = 𝝏𝑳 𝝏𝒘 𝟏𝟏 𝝏𝑳 𝝏𝒘 𝟏𝟐 𝝏𝑳 𝝏𝒘 𝟏𝟑 𝝏𝑳 𝝏𝒘 𝟐𝟏 𝝏𝑳 𝝏𝒘 𝟐𝟐 𝝏𝑳 𝝏𝒘 𝟐𝟑 𝒙 𝟏 𝒙 𝟐 𝒚 𝟐 𝒚 𝟏 𝒚 𝟑 • 기울기가 가리키는 쪽은 각 지점에서 함수의 출력 값을 가장 크게 줄이는 방향이다. • 손실함수의 값을 줄이기 위한 가중치 매개 변수의 기울기 값을 구해야 한다. • 가중치 매개 변수의 기울기가 가리키는 방향이 손실함수의 값을 줄일 수 있는 방향이다. 기울기 신경망 변수 각 연결의 Weight 함수 손실함수 / 비용함수 기울기 가중치 매개변수에 대한 비용함수의 기울기  신경망에 기울기 대입
  • 90. 신경망의 학습 기울기 신경망 적용 구현 예 미분과 기울기  은닉층 없이 입력층 2개, 출력층 3개 뉴런으로 구성된 신경망을 구현하고, 1회 학습으로 손실함수와 기울기를 구한다. • 가중치는 정규분포를 이용해서 초기화 한다. • 출력증의 활성화 함수는 Softmax를 사용하고 비용함수는 교차엔트로피 함수를 사용한다. import numpy as np from MyLib.functions import softmax, cross_entropy_error from MyLib.gradient import numerical_gradient class SimpleNet: def __init__(self): self.W = np.random.randn(2,3) def predict(self, x): z = np.dot(x, self.W) y = softmax(z) return y def loss(self, x, t): y = self.predict(x) loss = cross_entropy_error(y, t) print("가중치 n", self.W, "n - 손실 값 : ", loss) return loss net = SimpleNet() # 가중치 초기화 x = np.array([0.6, 0.9]) # 입력 값 t = np.array([0, 0, 1]) # 정답레이블 print("입력값: ", x) print("가중치 초기값: n", net.W) print("=================================================") f = lambda w: net.loss(x,t) grad = numerical_gradient(f, net.W) print("=================================================") print("신경망 기울기: n", grad) 입력값: [0.6 0.9] 가중치 초기값: [[ 0.96339351 1.23666218 0.18362639] [-0.64247516 0.84511081 0.30620984]] ========================================= 가중치 [[ 0.96349351 1.23666218 0.18362639] [-0.64247516 0.84511081 0.30620984]] - 손실 값 : 1.5549822034660628 가중치 [[ 0.96329351 1.23666218 0.18362639] [-0.64247516 0.84511081 0.30620984]] - 손실 값 : 1.554964975018745 가중치 [[ 0.96339351 1.23676218 0.18362639] [-0.64247516 0.84511081 0.30620984]] - 손실 값 : 1.555012303511828 가중치 [[ 0.96339351 1.23656218 0.18362639] [-0.64247516 0.84511081 0.30620984]] - 손실 값 : 1.554934875354396 ...  가중치가 6개임으로 12번 계산 ========================================== 신경망 기울기: [[ 0.08614224 0.38714079 -0.47328302] [ 0.12921335 0.58071118 -0.70992454]] (1.5549822034660628-1.554964975018745)/0.0002=0.08614224
  • 91. 경사 하강법 신경망의 학습 경사 하강법 (Gradient Descent Method)  경사 하강법이란? • 기울기를 잘 이용해 함수의 최솟값 (또는 가능한 한 작은 값)을 찾는 방법 • 기울기를 계산하고 기울어진 방향으로 적당히 움직이는 단계를 반복  경사 하강법 수식 • 𝜂 : 학습률 (learning rate) 한 번의 학습으로 얼마만큼 학습해야 하는 지 • 위 단계를 반복하면서 함수의 값을 줄이는 것 𝑥𝑖 = 𝑥𝑖 − 𝜂 𝜕𝑓 𝜕𝑥𝑖
  • 92. 경사 하강법 신경망의 학습 경사 하강법 (Gradient Descent Method)의 구현  𝒇 𝒙 𝟎, 𝒙 𝟏 = 𝒙 𝟎 𝟐 + 𝒙 𝟏 𝟐 인 함수의 최솟값을 경사 하강법으로 구하기 import numpy as np def grad(f, x): h = 1e-4 grad = np.zeros_like(x) # x와 같은 형상의 배열 for idx in range(x.size): tmp = x[idx] x[idx] = tmp+h fx1 = f(x) # f(x+h) x[idx] = tmp-h fx2 = f(x) # f(x-h) grad[idx] = (fx1-fx2)/(2*h) x[idx] = tmp # 원래 값으로 return grad def gradDescent(f, initX, lr, step=100): x = initX for i in range(step): print(x) x -= lr*grad(f, x) print(x) return x def sFunc2(x): return x[0]**2 + x[1]**2 initX = np.array([-3.0, 4.0]) finalX = gradDescent(sFunc2, initX, 0.1) [-3. 4.] [-2.4 3.2] [-1.92 2.56] [-1.536 2.048] [-1.2288 1.6384] [-0.98304 1.31072] [-0.786432 1.048576] [-0.6291456 0.8388608] [-0.50331648 0.67108864] [-0.40265318 0.53687091] [-0.32212255 0.42949673] [-0.25769804 0.34359738] [-0.20615843 0.27487791] [-0.16492674 0.21990233] [-0.1319414 0.17592186] ... [-5.69141277e-09 7.58855036e-09] [-4.55313022e-09 6.07084029e-09] [-3.64250417e-09 4.85667223e-09] [-2.91400334e-09 3.88533778e-09] [-2.33120267e-09 3.10827023e-09] [-1.86496214e-09 2.48661618e-09] [-1.49196971e-09 1.98929295e-09] [-1.19357577e-09 1.59143436e-09] [-9.54860614e-10 1.27314749e-09] [-7.63888491e-10 1.01851799e-09] [-6.11110793e-10 8.14814391e-10]  이 값은 [0,0]과 거의 같음
  • 93. 경사 하강법 신경망의 학습 경사 하강법 (Gradient Descent Method)에서 학습률의 영향  𝒇 𝒙 𝟎, 𝒙 𝟏 = 𝒙 𝟎 𝟐 + 𝒙 𝟏 𝟐 인 함수의 경사 하강법에서 학습률을 0.0001, 0.1, 10 적용해 보기 import numpy as np def grad(f, x): ... def gradDescent(f, initX, lr, step=100): x = initX for i in range(step): print(x) x -= lr*grad(f, x) print(x) return x def sFunc2(x): return x[0]**2 + x[1]**2 initX = np.array([-3.0, 4.0]) finalX = gradDescent(sFunc2, initX, 0.0001) initX = np.array([-3.0, 4.0]) finalX = gradDescent(sFunc2, initX, 0.1) initX = np.array([-3.0, 4.0]) finalX = gradDescent(sFunc2, initX, 10) [-2.94059014 3.92078685] [-6.11110793e-10 8.14814391e-10] [-2.58983747e+13 -1.29524862e+12] • 학습률이 너무 작으면 값이 거의 갱신되지 않음. • 학습률이 너무 크면 큰 값으로 발산함.  적절한 학습률이 중요  적절한 학습률은 가중치와는 다르게 사람이 직접 설정하는 하이퍼파라미터(Hyper parameter)임. [From] https://www.oreilly.com/library/view/hands-on-machine-learning/9781491962282/ch04.html Learning rate too small Learning rate too large
  • 94. 경사 하강법 신경망의 학습 신경망 학습 순서  경사 하강법 (Gradient Descent Method)을 이용한 신경망 학습 신경망 설계 미니배치 기울기 산출 매개변수 갱신 성능평가 [ 반복학습 ] 단계 설명 신경망 설계 목적에 적합한 신경망 설계 : 층의 깊이, 뉴런의 수, 활성화 함수 등 미니 배치 훈련 데이터의 일부 추출 기울기 산출 손실 함수의 값을 줄이기 위해 각 매개변수의 기울기 산출 매개변수 갱신 가중치 매개변수를 기울기 방향으로 아주 조금 갱신 성능평가 훈련데이터가 아닌 시험데이터로 완성된 모델의 성능을 평가. Overfitting 확인
  • 95. 확률적 경사 하강법 (SGD) 신경망의 학습  확률적 경사 하강법 : Stochastic Gradient Descent (SGD) • 훈련 데이터에서 소량의 데이터를 적당히 선택(미니 배치)해 손실을 계산한 후 매개 변수 갱신 처리를 수행 • 만약 모든 훈련 데이터를 손실을 계산한다면,  훈련 데이터가 많다면 계산이 많아져 학습이 오래 걸린다.  가중치 초기 설정에 따라 Global Minimum이 아닌 Local Minimum 값으로 수렴할 수 이다. • 만약 하나의 학습 데이터마다 손실을 계산한다면,  개별 훈련 데이터마다 매개변수를 갱신함으로 오차에 민감하고, 신경망 성능이 들쑥날쑥 변한다. • 대부분 딥러닝 프레임워크는 SGD라는 함수로 이 기능을 구현하고 있음. 경사 하강법
  • 96. 에폭 (Epoch) 신경망의 학습  Epoch의 정의 • 신경망 학습에 사용되는 단위 • 1 epoch : 학습 시 훈련 데이터를 모두 소진했을 때의 횟수 • 예) MNIST 훈련 데이터 6만장을 100개의 미니배치로 학습할 경우 SGD 600번 반복하면 1 epoch이 된다. 경사 하강법  학습 시킨 데이터도 재 학습 시키면 신경망이 개선된다. • 단, 학습을 너무 많이 시키면 훈련데이터에 오버피팅 되는 현상이 나타난다. [From] https://www.oreilly.com/library/view/hands-on-machine-learning/9781491962282/ch04.html
  • 97. MINST를 위한 신경망 설계  MNIST를 위한 신경망 설계 (2층 신경망) • 입력층 : 784개 (이미지 크기가 28x28 픽셀임으로) • 은닉층 : 100개 • 출력층 : 10개 (0에서 9로 분류함으로) • 은닉층의 활성화 함수는 Sigmoid 함수를 활용한다. • 출력층의 활성화 함수는 Softmax 함수를 활용한다. • 가중치는 정규분포로 초기화한다. • 손실함수는 교차엔트로피함수를 사용한다. • 학습은 미니배치로 100개를 추출하여 학습하고 1,000번 반복 학습한다. • 학습률은 0.1로 한다 MNIST 적용 신경망의 학습 𝒙 𝟏 𝒙 𝟐 𝒛 𝟏𝟎𝟎 (𝟏) 𝒛 𝟏 (𝟏) 𝒚 𝟏 𝒚 𝟏𝟎 𝟏 𝟏 w b 𝒙 𝟕𝟖𝟒 … … … X W1 W2  Y 784 784 x 100 100 x 10 10 일치 일치 일치
  • 98. MINST 구현 1 – 2층 신경망 클래스 구현 MNIST 적용 신경망의 학습 import numpy as np import MyLib.functions as mf import MyLib.gradient as mg class MnistNet: def __init__(self, inputSize, hiddenSize, outputSize, weightInitStd=0.01): self.params = {} self.params['W1'] = weightInitStd * np.random.randn(inputSize, hiddenSize) self.params['W2'] = weightInitStd * np.random.randn(hiddenSize, outputSize) self.params['b1'] = np.zeros(hiddenSize) self.params['b2'] = np.zeros(outputSize) def predict(self, x): z = mf.sigmoid(np.dot(x, self.params['W1']) + self.params['b1']) y = mf.softmax(np.dot(z, self.params['W2']) + self.params['b2']) return y def loss(self, x, t): y = self.predict(x) return mf.cross_entropy_error(y, t) def accuracy(self, x, t): y = self.predict(x) y = np.argmax(y, axis=1) t = np.argmax(t, axis=1) accuracy = np.sum(y==t) / float(x.shape[0]) return accuracy def grad(self, x, t): lossW = lambda W : self.loss(x, t) grad = {} grad['W1'] = mg.numerical_gradient(lossW, self.params['W1']) grad['W2'] = mg.numerical_gradient(lossW, self.params['W2']) grad['b1'] = mg.numerical_gradient(lossW, self.params['b1']) grad['b2'] = mg.numerical_gradient(lossW, self.params['b2']) return grad
  • 99. MINST 구현 2 – 미니배치 학습 구현 MNIST 적용 신경망의 학습 import numpy as np from MyLib.mnist import load_mnist from Training.MnistNet import MnistNet #1.데이터 확보 및 전처리 (trainImg, trainLbl),(testImg, testLbl) = load_mnist(one_hot_label=True) #2.신경망 초기화 network = MnistNet(784, 50, 10) #3.하이퍼파라미터 초기화 itersNum = 1000 learningRate = 0.1 batchSize = 100 trainSize = trainImg.shape[0] #4.학습진행현황 기록변수 trainLossList = [] print("-- 학습 시작 --") # 학습 for i in range(itersNum): # 미니배치 miniBatchMask = np.random.choice(trainSize, batchSize) trainImgBatch = trainImg[miniBatchMask] trainLblBatch = trainLbl[miniBatchMask] # 기울기계산 grad = network.grad(trainImgBatch, trainLblBatch) # 매개변수갱신 for key in ('W1', 'W2', 'b1', 'b2'): network.params[key] -= learningRate*grad[key] # 손실합수의 값 기록 loss = network.loss(trainImgBatch, trainLblBatch) trainLossList.append(loss) print("iteration %d 손실 값: %f" % (i, loss)) print("-- 학습 종료 --") -- 학습 시작 -- iteration 0 : 2.29192863536 iteration 1 : 2.29489284268 iteration 2 : 2.28903658939 … 결과 생략 … iteration 997 : 0.489302945227 iteration 998 : 0.454912045635 iteration 999 : 0.494802915552 -- 학습 종료 –  학습에 하루가 소요
  • 100. 실습 신경망의 학습  𝒇 𝒙 𝟎, 𝒙 𝟏, 𝒙 𝟐 = 𝟓𝒙 𝟎 𝟑 + 𝟑𝒙 𝟏 𝟐 + 𝟕𝒙 𝟐인 함수의 기울기 구하기 • 𝒇 𝟐, 𝟑, 𝟒 일 때 함수 계산 결과는 95이고, 기울기는 (60, 18, 7) 이다. #1 – 기울기 계산
  • 101. 실습 신경망의 학습  𝒇 𝒙 𝟎, 𝒙 𝟏, 𝒙 𝟐 = 𝟓𝒙 𝟎 𝟑 + 𝟑𝒙 𝟏 𝟐 + 𝟕𝒙 𝟐인 함수에 경사하강법 적용하기 • 초기값 : 𝒇 𝟐, 𝟑, 𝟒 • 학습률 : 0.05 • 반복횟수 : 20회 • 경사하강법 적용 후 이동된 X 값, 함수 계산 결과, 이동 후 기울기 값을 구한다. #2 – 경사하강법 적용
  • 103. Computational Graph  Computational Graph (계산 그래프)란 계산 과정을 그래프로 나타낸 것이다. 사과 2개, 귤 3개를 사는데 사과는 1개 100원, 귤은 150원이고 소비세는 10%일 때 지불 금액은 얼마인가? 계산 그래프 신경망의 역전파 x + x x 2 100 3 150 200 450 650 1.1 715 • Computational Graph에서 계산을 왼쪽에서 오른쪽으로 진행하는 것을 순전파 (forward propagation)이라고 한다. • 계산 그래프에서 종착점에서 출발점으로 미분을 계산하는 것을 역전파(backward propagation)이라고 한다.  Computational Graph 의 장점 • 국소적 계산 : 전체에서 어떻게 진행되는 상관없이 자신과 관계된 정보만으로 계산 (예, 가운데 + Node의 경우 여러 식품을 구매하더라도 해당 노드는 더하는 계산만 하면 됨. • 중간 계산 결과를 모두 보관할 수 있다. • 역전파를 통해 ‘미분’을 효율적으로 계산할 수 있다.  사과 가격, 귤 가격, 사과 개수, 귤 개수, 소비세에 대한 지불 금액의 미분을 계산할 수 있다.
  • 104. Computational Graph의 역전파 계산시는 미분을 계산하여 앞쪽 노드로 전파한다.  Backward Propagation의 계산 절차 예) 𝑦 = 𝑓(𝑥) 의 역전파 f x E 𝝏𝒚 𝝏𝒙 E • 역전파의 계산 절차는 신호 E에 노드의 편미분 𝝏𝒚 𝝏𝒙 을 곱한 후 다음 노드로 전달하는 것 • 𝑦 = 𝑥2 인 경우, 𝝏𝒚 𝝏𝒙 = 2𝑥 가 된다. y 계산 그래프 신경망의 역전파
  • 105. 합성함수와 Chain Rule(연쇄법칙)이란 합성 함수의 미분의 성질이며, 합성 함수의 미분은 합성함수를 구성하는 각 함수의 미분의 곱이다.  합성 함수의 예 ( 𝒛 = (𝒙 + 𝒚) 𝟐 ) 순전파 계산 • 𝑧 = 𝑡2 • 𝑡 = 𝑥 + 𝑦 + **2 x y t z • 𝝏𝒛 𝝏𝒛 𝝏𝒛 𝝏𝒕 𝝏𝒕 𝝏𝒙 = 𝝏𝒛 𝝏𝒕 𝝏𝒕 𝝏𝒙 = 𝝏𝒛 𝝏𝒙 즉, x에 대한 z의 미분, 즉 역전파는 연쇄법칙의 원리와 같다. 𝝏𝒛 𝝏𝒛 = 𝟏 𝝏𝒛 𝝏𝒛 𝝏𝒛 𝝏𝒕 역전파 계산 • 𝝏𝒛 𝝏𝒙 = 𝝏𝒛 𝝏𝒕 𝝏𝒕 𝝏𝒙 • 𝝏𝒛 𝝏𝒕 = 𝟐𝒕 이고 𝝏𝒛 𝝏𝒙 = 𝟏 임으로 𝝏𝒛 𝝏𝒙 = 𝟐𝒕 ∗ 𝟏 = 𝟐 𝒙 + 𝒚 가 된다. 계산 그래프 신경망의 역전파
  • 106. 덧셈노드와 곱셈노드의 역전파를 예를 통해서 확인해 본다.  덧셈 노드 ( 𝒛 = 𝒙 + 𝒚 ) • 𝝏𝒛 𝝏𝒙 = 𝟏 이고 𝝏𝒛 𝝏𝒚 = 𝟏 이다 + x y z 𝝏𝑳 𝝏𝒛 𝝏𝑳 𝝏𝒛 은 상류에서 전해진 미분 값 + 10 5 15 𝟏. 𝟑 역전파 계산 • 만약 상류에서 1.3이 흘러오면 다음 노드 로 1.3을 전달한다.  곱셈 노드 ( 𝒛 = 𝒙𝒚 ) • 𝝏𝒛 𝝏𝒙 = 𝒚 이고 𝝏𝒛 𝝏𝒚 = 𝒙 이다 + x y z 𝝏𝑳 𝝏𝒛 𝝏𝑳 𝝏𝒛 은 상류에서 전해진 미분 값 + 10 5 50 𝟏. 𝟑 역전파 계산 • 만약 상류에서 1.3이 흘러오면 한 군데는 6.5 (1.3x5) 다른 하나는 13 (1.3x10)을 보 낸다. • 곱셈 역 전파 계산 시 순방향 입력 신호 값이 필요함. 계산 그래프 신경망의 역전파
  • 107. 사과 귤 쇼핑의 역전파를 계산해 보자  순전파 사과 2개, 귤 3개를 사는데 사과는 1개 100원, 귤은 150원이고 소비세는 10%일 때 지불 금액은 얼마인가? x + x x 2 100 3 150 200 450 650 1.1 715  역전파 x + x x 110 2.2 165 3.3 1.1 1.1 1.1 650 1 계산 그래프 신경망의 역전파 사과 가격이 1원 오르면 최종 금액은 2.2원 오른다.
  • 108. 계산 그래프의 구현  덧셈 노드와 곱셈 노드의 구현 계산 그래프 신경망의 역전파 class AddLayer: def __init__(self): pass # 아무것도 하지말 것. def forward(self, x, y): return x+y def backward(self, dout): dx = dout * 1 dy = dout * 1 return dx, dy class MulLayer: def __init__(self): self.x = None # 순전파의 입력값을 유지 self.y = None def forward(self, x, y): self.x = x self.y = y return x*y def backward(self, dout): dx = dout*self.y dy = dout*self.x return dx, dy
  • 109. 계산 그래프의 구현  사과 귤 쇼핑에 적용 계산 그래프 신경망의 역전파 # 입력값 applePrice = 100 orangePrice = 150 appleCnt = 2 orangeCnt = 3 tax = 1.1 # 계산그래프 설계 appleLayer = MulLayer() orangeLayer = MulLayer() sumLayer = AddLayer() taxLayer = MulLayer() # 순전파 appleTotal = appleLayer.forward(applePrice, appleCnt) orangeTotal = orangeLayer.forward(orangePrice, orangeCnt) total = sumLayer.forward(appleTotal, orangeTotal) totalWithTax = taxLayer.forward(total, tax) print(appleTotal, orangeTotal, total, totalWithTax) # 역전파 dout = 1 dsum, dtax = taxLayer.backward(dout) dappleTotal, dorangeTotal = sumLayer.backward(dsum) dapplePrice, dappleCnt = appleLayer.backward(dappleTotal) dorangePrice, dorangeCnt = orangeLayer.backward(dorangeTotal) print(dsum, dtax, dappleTotal, dorangeTotal) print(dapplePrice, dappleCnt, dorangePrice, dorangeCnt) 200 450 650 715.0000000000001 1.1 650 1.1 1.1 2.2 110.00000000000001 3.3000000000000003 165.0
  • 110. Back Propagation 알고리즘  역 전파 알고리즘 (Back propagation algorithm) • Deep Learning의 대표적인 지도학습 알고리즘. • 신경망 매개변수의 기울기를 수치미분을 통해서 구한다면 계산 시간이 매우 오래 걸린다. • 학습된 출력 값과 실제 값과의 차이인 손실의 역전파를 통해 가중치를 구한다. (Backward propagation of errors) • 전파된 오차를 이용하여 가중치를 조정한다. • 역전파 알고리즘은 매개변수의 기울기를 효율적으로 계산하는 방법이다. • Back propagation 알고리즘은 Gradient descent rule과 결합되어 인공신경망 학습 알고리즘으로 많이 이용된다. • 딥러닝 오픈 프레임워크에는 역 전파 알고리즘이 구현되어 있다. 역전파 알고리즘 신경망의 역전파
  • 111. • 출력층의 오차 : 지도학습 데이터의 정답과 출력층의 출력 값의 차이 • 은닉층의 오차 : 출력층의 오차가 가중치를 고려하여 역방향으로 전달 • 델타(𝜹)규칙 : 어떤 입력 노드가 출력 노드의 오차에 기여했다면, 두 노드의 연결 가중치는 오차에 비례해 조절한다. • 델타(𝜹) : 델타는 활성함수의 도함수(derivatives)를 이용해 계산.. 역전파 알고리즘 신경망의 역전파 Back Propagation 알고리즘 (Cont’d)  역 전파 알고리즘 (Back propagation algorithm)
  • 112. 신경망의 계층을 깊게 만들면 역 전파 알고리즘으로 심층 신경망을 학습 시킬 때 어려움을 겪는다.  Vanishing Gradient (기울기 소멸) 문제 • 역 전파 알고리즘으로 학습시킬 때 앞쪽의 은닉층으로 오차가 거의 전달 안됨 (즉, 학습이 잘 안됨) 학습 거의 안됨 학습 잘 됨 • 은닉층 활성화 함수로 ReLU 함수를 사용하면 Sigmoid보다 빠르고 Vanishing Gradient 문제가 적어진다.  Over-fitting (과적합) 문제 • 신경망이 깊어지면 복잡한 모델이 되어 과적합에 취약 • Dropout / Batch Normalization 기법으로 해결  많은 계산량 문제 • 신경망이 깊어지면 가중치가 기하급수적으로 증가되고, 학습 데이터도 많이 필요하고, 계산량이 급증함. • GPU의 활용과 배치 정규화(Batch Normalization, 2015년) 등의 알고리즘으로 개선 역전파 알고리즘 신경망의 역전파
  • 113. • forward propagation • backward propagation ReLU 계층을 하나의 클래스로 구현  ReLU (활성화 함수) 𝒚 = 𝒙 (𝒙 > 𝟎) 𝟎 (𝒙 ≤ 𝟎) 𝝏𝒚 𝝏𝒙 = 𝟏 (𝒙 > 𝟎) 𝟎 (𝒙 ≤ 𝟎) ReLU 𝒙 𝒚 𝝏𝑳 𝝏𝒚 𝝏𝑳 𝝏𝒚 ReLU 𝒙 𝒚 𝝏𝑳 𝝏𝒚 𝟎 [ 𝒙 > 𝟎 인 경우] [ 𝒙 ≤ 𝟎인 경우]  구현 코드 계층별 구현 신경망의 역전파 import numpy as np class Relu: def __init__(self): self.mask = None def forward(self, x): self.mask = (x <= 0) out = x.copy() out[self.mask] = 0 return out def backward(self, dout): dout[self.mask] = 0 dx = dout return dx relu = Relu() x = np.array([[1.1, -0.3],[-1.4,3.1]]) print("입력값 : n" , x) print("순전파 : n" , relu.forward(x)) print("마스크 : n" , relu.mask) dout = np.array([[0.1, 0.2],[0.3, 0.4]]) print("손실값 : n" , dout) print("역전파 : n" , relu.backward(dout)) 입력값 : [[ 1.1 -0.3] [-1.4 3.1]] 순전파 : [[1.1 0. ] [0. 3.1]] 마스크 : [[False True] [ True False]] 손실값 : [[0.1 0.2] [0.3 0.4]] 역전파 : [[0.1 0. ] [0. 0.4]] • 순전파시 mask를 만들어 저장 • 역전파시 mask를 활용하여 True 인 곳에 0으로 전파
  • 114. • forward propagation • backward propagation Sigmoid 계층을 하나의 클래스로 구현 (backward 공식 도출 과정은 생략)  Sigmoid (활성화 함수) 𝒚 = 𝟏 𝟏 + 𝒆−𝒙 𝝏𝒚 𝝏𝒙 = 𝒚(𝟏 − 𝒚) Sigmoid 𝒙 𝒚 𝝏𝑳 𝝏𝒚 𝝏𝑳 𝝏𝒚 𝒚(𝟏 − 𝒚)  구현 코드 계층별 구현 신경망의 역전파  역전파는 순전파의 출력만으로 계산 가능 import numpy as np class Sigmoid: def __init__(self): self.out = None def forward(self, x): out = 1 / (1 + np.exp(-x)) self.out = out return out def backward(self, dout): dx = dout * self.out * (1.0 - self.out) return dx sigmoid = Sigmoid() x = np.array([[1.1, -0.3],[-1.4,3.1]]) print("입력값 : n" , x) print("순전파 : n" , sigmoid.forward(x)) dout = np.array([[0.1, 0.2],[0.3, 0.4]]) print("손실값 : n" , dout) print("역전파 : n" , sigmoid.backward(dout)) 입력값 : [[ 1.1 -0.3] [-1.4 3.1]] 순전파 : [[0.75026011 0.42555748] [0.19781611 0.95689275]] 손실값 : [[0.1 0.2] [0.3 0.4]] 역전파 : [[0.01873699 0.04889166] [0.04760547 0.01649961]] • 순전파의 출력을 out 에 보관 • 역전파 계산 시 out 값을 활용하여 계산
  • 115. • forward propagation Affine 계층을 하나의 클래스로 구현 (backward 계산과정은 생략)  Affine 변환 : 신경망 순전파시 수행하는 행렬의 내적 dot 𝑿 (N,2) 𝒀 𝝏𝑳 𝝏𝒀 + • backward propagation 𝑾 (2,3) 𝑿 ∙ 𝑾 𝑩 (3,) dot + 𝝏𝑳 𝝏𝒀 𝝏𝑳 𝝏𝑩 = 𝝏𝑳 𝝏𝒀 의 첫 번째 축(axis=0)의 합 𝝏𝑳 𝝏𝑾 = 𝑿 𝑻 ∙ 𝝏𝑳 𝝏𝒀 𝝏𝑳 𝝏𝑿 = 𝝏𝑳 𝝏𝒀 ∙ 𝑾 𝑻 𝑾 𝑻 는 𝑾의 전치 행렬이다. 𝑾 = 1 2 3 4 5 6 이면 𝑾 𝑻 = 1 4 2 5 3 6 이다 계층별 구현 신경망의 역전파 (N,3) (N,3) (N,3)(N,3) (3) (2,3) (N,3) (2,N)(N,3) (N,3)(3,2)(N,2)  배치처리 가능  구현 코드 import numpy as np class Affine: def __init__(self, W, b): self.W = W self.b = b self.x = None self.dW = None self.db = None def forward(self, x): self.x = x out = np.dot(x, self.W) + self.b return out def backward(self, dout): dx = np.dot(dout, self.W.T) self.dW = np.dot(self.x.T, dout) self.db = np.sum(dout, axis=0) return dx W = np.arange(1,7).reshape(2,3) b = np.zeros(3) affine = Affine(W,b) X = np.arange(1,5).reshape(2,2) print("--- 순전파 ---") print(X) print(W) print(b) print(affine.forward(X)) print("--- 역전파 ---") dout = np.arange(1,7).reshape(2,3) print(dout) print(affine.backward(dout)) print(affine.dW) print(affine.db) --- 순전파 --- [[1 2] [3 4]] [[1 2 3] [4 5 6]] [0. 0. 0.] [[ 9. 12. 15.] [19. 26. 33.]] --- 역전파 --- [[1 2 3] [4 5 6]] [[14 32] [32 77]] [[13 17 21] [18 24 30]] [5 7 9]
  • 116. • 간소화된 Softmax-with-Loss 의 계산 그래프 Softmax-with-Loss 계층을 하나의 클래스로 구현 (backward 계산과정은 생략)  Softmax 함수와 Cross Entropy 함수를 같이 구현 𝒂 𝟏  구현 코드 import numpy as np from MyLib.functions import softmax, cross_entropy_error class SoftmaxWithLoss: def __init__(self): self.loss = None self.y = None # Softmax 출력 self.t = None # 정답레이블 (One-Hot 인코딩) def forward(self, x, t): self.t = t self.y = softmax(x) self.loss = cross_entropy_error(self.y, self.t) return self.loss def backward(self, dout=1): batchSize = self.t.shape[0] dx = (self.y - self.t) / batchSize return dx softmaxloss = SoftmaxWithLoss() x = np.array([0.3, 0.2, 0.5]) t = np.array([0.0, 1.0, 0.0]) print(softmaxloss.forward(x, t)) print(softmaxloss.backward()) x = np.array([0.1, 0.9, 0.0]) t = np.array([0.0, 1.0, 0.0]) print(softmaxloss.forward(x, t)) print(softmaxloss.backward()) 𝒚 𝟏 − 𝒕 𝟏 3개 분류로 가정 𝒂 𝟏, 𝒂 𝟐, 𝒂 𝟑 는 Softmax 계층의 입력 𝒚 𝟏, 𝒚 𝟐, 𝒚 𝟑 는 Softmax 계층의 출력 (정규화, 합계가 1) 𝒕 𝟏, 𝒕 𝟐, 𝒕 𝟑 는 정답 레이블 𝑳 은 비용함수 값 (손실) 역전파의 결과 : 𝒚 𝟏 − 𝒕 𝟏, 𝒚 𝟐 − 𝒕 𝟐, 𝒚 𝟑 − 𝒕 𝟑 Softmax Cross Entropy Error 𝒂 𝟐 𝒚 𝟐 − 𝒕 𝟐 𝒂 𝟑 𝒚 𝟑 − 𝒕 𝟑 𝒚 𝟏 𝒚 𝟐 𝒚 𝟑 𝑳 𝟏 𝒕 𝟏 𝒕 𝟐 𝒕 𝟑 • Softmax 계층은 학습 시에는 활용하지만 추론 시에는 활용 하지 않는다. • 회귀 목적의 신경망에서는 항등함수의 손실함수로 평균제곱 오차를 활용한다. 계층별 구현 신경망의 역전파 1.23983106084446 [ 0.10662435 -0.23685563 0.13023128] 0.61836901210598 [ 0.08070286 -0.15372582 0.07302296]  오차크기에 따라 전파되는 크기도 차이가 남
  • 117. MINST를 위한 신경망 설계  MNIST를 위한 신경망 설계 (이전과 동일) • 입력층 : 784개 (이미지 크기가 28x28 픽셀임으로) • 은닉층 : 100개 • 출력층 : 10개 (0에서 9로 분류함으로) • 은닉층의 활성화 함수는 Sigmoid 함수를 활용한다. • 출력층의 활성화 함수는 Softmax 함수를 활용한다. • 가중치는 정규분포로 초기화한다. • 손실함수는 교차엔트로피함수를 사용한다. • 학습률은 0.1로 한다 MNIST 적용 𝒙 𝟏 𝒙 𝟐 𝒛 𝟏𝟎𝟎 (𝟏) 𝒛 𝟏 (𝟏) 𝒚 𝟏 𝒚 𝟏𝟎 𝟏 𝟏 w b 𝒙 𝟕𝟖𝟒 … … … X W1 W2  Y 784 784 x 100 100 x 10 10 일치 일치 일치 신경망의 역전파  MNIST를 위한 신경망 설계 (조정내역) • 계층별 구현을 적용하여 신경망을 구현한다. • 경사하강법 적용 시 수치계산이 아닌 역전파를 활용한다. • 학습은 미니배치로 100개를 추출하여 학습하고 10,000번 반복 학습한다.
  • 118. MINST 구현 1 – 2층 신경망 클래스 구현 MNIST 적용 import numpy as np import MyLib.layers as ml from collections import OrderedDict class MnistNet: def __init__(self, inputSize, hiddenSize, outputSize, weightInitStd=0.01): self.params = {} self.params['W1'] = weightInitStd * np.random.randn(inputSize, hiddenSize) self.params['W2'] = weightInitStd * np.random.randn(hiddenSize, outputSize) self.params['b1'] = np.zeros(hiddenSize) self.params['b2'] = np.zeros(outputSize) # 계층생성 self.layers = OrderedDict() self.layers['Affine1'] = ml.Affine(self.params['W1'], self.params['b1']) self.layers['Relu1'] = ml.Relu() self.layers['Affine2'] = ml.Affine(self.params['W2'], self.params['b2']) self.lastLayer = ml.SoftmaxWithLoss() def predict(self, x): for layer in self.layers.values(): x = layer.forward(x) return x def loss(self, x, t): y = self.predict(x) return self.lastLayer.forward(y, t) def accuracy(self, x, t): y = self.predict(x) y = np.argmax(y, axis=1) t = np.argmax(t, axis=1) accuracy = np.sum(y==t) / float(x.shape[0]) return accuracy 신경망의 역전파 다음 장에 계속…
  • 119. MINST 구현 1 – 2층 신경망 클래스 구현 MNIST 적용 def grad(self, x, t): #순전파 self.loss(x, t) #역전파 dout = 1 dout = self.lastLayer.backward(dout) layers = list(self.layers.values()) layers.reverse() for layer in layers: dout = layer.backward(dout) grad = {} grad['W1'] = self.layers['Affine1'].dW grad['b1'] = self.layers['Affine1'].db grad['W2'] = self.layers['Affine2'].dW grad['b2'] = self.layers['Affine2'].db return grad 신경망의 역전파
  • 120. MINST 구현 2 – 미니배치 학습 구현 MNIST 적용 import numpy as np from MyLib.mnist import load_mnist from Backward.MnistNet import MnistNet #1.데이터 확보 및 전처리 (trainImg, trainLbl),(testImg, testLbl) = load_mnist(one_hot_label=True) #2.신경망 초기화 network = MnistNet(784, 50, 10) #3.하이퍼파라미터 초기화 itersNum = 10000 learningRate = 0.1 batchSize = 100 trainSize = trainImg.shape[0] #4.학습진행현황 기록변수 trainLossList = [] print("-- 학습 시작 --") # 학습 for i in range(itersNum): # 미니배치 miniBatchMask = np.random.choice(trainSize, batchSize) trainImgBatch = trainImg[miniBatchMask] trainLblBatch = trainLbl[miniBatchMask] # 기울기계산 grad = network.grad(trainImgBatch, trainLblBatch) # 매개변수갱신 for key in ('W1', 'W2', 'b1', 'b2'): network.params[key] -= learningRate*grad[key] # 손실합수의 값 기록 loss = network.loss(trainImgBatch, trainLblBatch) trainLossList.append(loss) print("iteration %d 손실 값: %f" % (i, loss)) print("-- 학습 종료 --") -- 학습 시작 -- iteration 0 : 2.29192863536 iteration 1 : 2.29489284268 iteration 2 : 2.28903658939 … 결과 생략 … iteration 9997 손실 값: 0.040860 iteration 9998 손실 값: 0.071562 iteration 9999 손실 값: 0.046348 -- 학습 종료 –  학습에 하루가 소요 신경망의 역전파
  • 121. 실습 신경망의 역전파  다음 계산 그래프의 역전파 값을 구한다. #1 – Computational Graph 의 계산
  • 122. 실습 신경망의 역전파  다음 계산 그래프의 순전파와 역전파를 구현하고 값을 확인한다. #2 – Computational Graph 의 구현
  • 123. VI. 학습 관련 기술
  • 124. 신경망 학습의 목적은 매개변수(가중치, 편향)의 최적값을 찾는 것이다. 이를 최적화(Optimization)이라고 한다.  최적화 알고리즘 • 신경망 가중치, 편향의 최적화는 매우 어려운 작업. 수식으로 단번에 최솟값을 구할 수 있는 방법이 없다. • 지금껏 최적화는 기울기를 이용해 기울어진 방향으로 매개변수 값을 갱신하는 일을 반복해서 최적의 값으로 다가감. (SGD, Stochastic Gradient Descent) • SGD는 문제에 따라 비효율적일 때가 있는데 이를 보완하는 최적화 기법이 나오고 있다. 최적화 (Optimization) 학습 관련 기술  최적화 구현의 모듈화 • 딥러닝 구현 시 최적화를 담당하는 클래스를 분리해서 구현하면 기능을 모듈화 할 수 있다. • 대부분의 딥러닝 프레임워크는 다양한 최적화 기법을 구현해 제공하며, 원하는 기법으로 쉽게 바꿀 수 있게 되어 있다. # Gradient 계산 grad = network.numericalGradient(trainImgBatch, trainLblBatch) # 가중치, 편향 갱신 for key in ('W1', 'W2', 'b1', 'b2'): network.params[key] -= learningRate*grad[key] [ MNIST 에서 Mini-batch SGD를 활용한 최적화 ] class SGD: def __init__(self, lr=0.01): self.lr = lr def update(self, params, grads): for key in params.keys(): params[key] -= self.lr * grads[key] class Momentum: … class Nesterov: … class AdaGrad:… … [ Optimizer 구현 ] optimizers["SGD"] = SGD(lr=0.95) … for i in range(max_iterations): … grads = networks[key].gradient(x_batch, t_batch) optimizers[key].update(networks[key].params, grads) [ Optimizer 호출 ]
  • 125. 다양한 최적화 알고리즘을 비교해보자  Gradient descent optimization algorithms 이름 특징 SGD (Stochastic Gradient Descent • 기울어진 방향(기울기)으로 일정 거리(학습률)만 이동 • 단순하지만 문제에 따라 비효율적이다. Momentum • 기울기 방향으로 물체가 가속되는 관성의 원리 적용. 속도 (Velocity)라는 변수가 추가 • 한 스텝전의 기울기를 일정한 비율로 반영하여 새로 계산된 기울기와 합해서 사용 Nesterov accelerated gradient (NAG) • Momentum에서 발전된 방법으로 momentum보다 더 공격적으로 속도(Velocity)를 활용 • 현재 가중치에서 기울기를 계산하기 전에, 먼저 학습했던 만큼 한 번 더 가본 상태로 계산 AdaGrad • 처음에는 학습률을 크게 하다가 조금씩 작게 학습하는 방법 • 전체 학습률을 조정하는 것이 아니라, 각각의 매개변수에 맞는 학습률을 조정. • 과거의 기울기를 제곱해서 계속 더해감으로 학습이 진행될수록 갱신 강도가 약해짐 Adadelta • AdaGrad의 extension. 그러나 생각보다 잘 작동 안 함. RMSprop • AdaGrad의 단점은 무한히 학습하다 보면 순간 갱신량이 0이 되어 학습이 안됨. • 이를 개선하여 RMSprop은 먼 과거의 기울기는 잊고 새로운 기울기 정보를 크게 반영 Adam (Adaptive Moment Estimation) • Momentum과 AdaGrad의 이점을 조합. • 학습률, 1차 momentum용 계수, 2차 momentum용 계수의 3개의 hyper paramter 설정 최적화 (Optimization) 학습 관련 기술
  • 126. 어떤 알고리즘을 선택해야 하는가?  최적화 기법 비교 • 모든 문제에 항상 뛰어난 기법은 없다. 즉, 문제 별로 최적화 기법을 선택 적용해야 한다. • 학습률 등의 하이퍼 파라미터의 설정 등에 따라 최적화 알고리즘의 결과도 달라딘다. • 대체적으로 SGD, Momentum, Adagrad, Adam 등을 사용한다. • Gradient descent optimization algorithms에 대해 자세히 알고 싶으면 아래를 참조한다. http://sebastianruder.com/optimizing-gradient-descent/ 최적화 (Optimization) 학습 관련 기술
  • 127. 신경망 학습에 가중치의 초기값 선정은 매우 중요하다.  Weight Decay 기법 (가중치 감소 기법) • 가중치를 작게 만들어 Overfitting을 억제하는 방법 • 가중치를 작게 만들려면 초기값을 최대한 작은 값에서 시작 • 초기값 선정 : 정규분포에서 Random하게 선택되는 값을 0.01배 한 작은 값 (표준편차가 0.01인 정규분포) 가중치 초기값 선정 class MyTwoLayerNet: def __init__(self, inputSize, hiddenSize, outputSize, weightInitStd = 0.01): self.params = {} self.params['W1'] = weightInitStd * np.random.randn(inputSize, hiddenSize) self.params['W2'] = weightInitStd * np.random.randn(hiddenSize, outputSize) self.params['b1'] = np.zeros(hiddenSize) self.params['b2'] = np.zeros(outputSize) [ MNIST 의 2층 신경망의 가중치 초기값 코드 ] • 가중치의 초기값을 0으로 만들면?  학습이 되지 않는다. 순전파시 가중치가 모두 0이면 두 번째 층의 노드에 모두 같은 값이 전달 됨 • 표준편차가 1인 정규분포를 사용해서 초기값 선정 (1*np.random.randn(inputSize, hiddenSize)) 시?  활성화함수로 Sigmoid 함수를 사용한다면 활성화 값이 0과 1로 치우쳐 분포됨.  기울기 소실 (Gradient Vanishing)문제 발생 : 층이 깊을수록 학습이 안됨. • 표준편차가 0.01인 정규분포를 사용해서 초기값 선정 (0.01*np.random.randn(inputSize, hiddenSize)) 시?  활성화함수 값이 거의 같은 값을 출력함으로 층이 깊어지는 의미가 없음. “각 층의 활성화 값은 적당히 고루 분포되어야 학습이 잘 이루어진다.” 학습 관련 기술
  • 128. Sigmoid 함수나 tanh 함수를 활성화 함수로 이용할 때 Xavier 초기값을 하고 ReLU인 경우 He 초기값을 이용한다.  Xavier (사비에르) 초기값 • Xavier Glorot와 Yoshua Bengio 논문에서 권장하는 가중치 초기값. • 활성화 함수로 Sigmoid 함수나 tanh함수를 사용할 때 적용 • 일반적인 딥러닝 프레임워크가 표준적으로 이용 • 초기값의 표준편차가 1 𝑛 인 정규분포로 초기화 (여기서 n은 앞 층 노드의 수) 가중치 초기값 선정  He 초기값 • Kaiming He 가 발견한 초기 값. • 활성화 함수가 ReLU일 때 적용 • 초기값의 표준편차가 2 𝑛 인 정규분포로 초기화 (여기서 n은 앞 층 노드의 수) [ ReLU 활성화 함수를 이용한 5층 신경망에서 MNIST 테스트 ] 학습 관련 기술
  • 129. 배치 정규화 (Batch Normalization)은 각 층에서의 활성화 값이 적당히 분포되도록 조정하는 것이다.  Batch Normalization • 데이터 분포를 정규화하는 배치 정규화 (Batch Norm)계층을 신경망에 삽입 (2015년도에 제안) 배치 정규화 • Batch Normalization의 장점  학습 속도의 개선  가중치 초기값에 크게 의존하지 않음.  Overfitting을 억제한다. (Dropout 등의 필요성 감소) • Batch Normalization에 대해 좀 더 자세한 내용  https://shuuki4.wordpress.com/2016/01/13/batch- normalization-%EC%84%A4%EB%AA%85-%EB%B0%8F- %EA%B5%AC%ED%98%84/ Affine ReLU Batch Norm (BN) Affine ReLU Batch Norm (BN) Affine ReLU Batch Norm (BN) [ Batch Normalization 수식 ] “Batch Normalization의 경우 Deep Learning의 필수적인 기법이 되어가고 있다.” 학습 관련 기술
  • 130. Over-fitting이란 신경망이 훈련 데이터에 지나치게 적응되어 실 데이터에는 성능이 안 나오는 것이다.  신경망에서의 Over-fitting 과적합 대응 • 신경망에서의 Overfitting은 다음 경우에 자주 발생함  매개변수가 많고 표현력이 높은 경우 (층이 많은 경우)  훈련 데이터가 적은 경우 • 과적합 대응 방법 : Weight Decay, Dropout 등 “Dropout의 경우 효과는 좋지만 학습 속도가 다소 느려진다.” “Batch Normalization의 경우 가중치 초기화 문제와 과적합 문제를 동시에 해결할 수 있다.”  Weight Decay (가중치 감소) • 원래 over-fitting은 가중치 값이 커서 발생하는 경우가 많다. • 가중치를 감소시키면 over-fitting이 억제되는 효과가 있다. • 하지만 신경망 모델이 복잡해지면 이걸로 불충분하다.  Dropout Algorithm • 2012년 Hinton 교수가 제안한 것으로 과적합 문제를 개선. • 신경망 학습 시 임의의 노드 몇 개를 생략해 학습하고, 다음 계산 시 또 다른 노드를 생략하고 학습 • 일반적으로 입력층에서 20%~25% 정도, 은닉층에서 50% 정도의 노드를 생략한다. • 효과 “학습 시 학습 데이터에 의해 연결의 weight가 동조화 되는 현상 (co-adaptation)을 피한다.” * Co-Adaptation : 노이즈에서 발생한 잘못된 특성이 모든 노드에 전파되어 의미 있는 특성을 선별하는데 부정적인 영향을 미치는 것 [ Dropout Algorithm ] 학습 관련 기술
  • 131. 과적합을 피하는 다양한 방법 중 검중(Validation) 기법을 알아본다.  학습 데이터의 일부를 따로 떼어 내어 학습이 아닌 검증용으로 사용하는 기법 보유하고 있는 데이터셋을 Training set (50%~60%), Validation set (20%~25%), Test set (20%~25%) 으로 구분 (1) Training set 을 가지고 예측 혹은 분류 모델을 훈련시키고 (2) Validation set을 가지고서 훈련 중인 모델이 혹시 과적합(over-fitting)인지 검증, 감시를 하면서 Hyper Parameter를 선정 (3) Test set을 사용해서 최종 모델(final model)에 대해서 평가  교차 검증 (Cross Validation) 학습 데이터를 용도별로 나누는 것은 같은데, 처음에 나눠진 데이터를 그대로 사용하는 것이 아니라 중간중간에 서로 다시 나눠 줌 과적합 대응 학습 관련 기술
  • 132. #1 – 경사하강법 비교하기  myoptimizercomparenaive.py 소스와 실행결과 확인 실습 학습 관련 기술