Open jwkwak45 opened 5 years ago
7/2 [실습] 이미지 처리 실습하기
파일을 가지고 이미지를 불러오고, 몇몇 조정을 거치는 실습.
https://github.com/sjchoi86/advanced-tensorflow/blob/master/basic/basic_imghandling.ipynb
위 링크에 모든 과정 적혀있음.
간단한 실습이라 따라가면서 해도 시간이 얼마 안걸림.
추후 데이터 셋을 가지고 다룰때 사용하게 될 코드
7/3 [실습] MNIST 데이터셋 사용법 익혀보기
https://github.com/sjchoi86/advanced-tensorflow/blob/master/basic/basic_mnist.ipynb
텐서플로우만 깔려있으면 mnist에 어디에서나 접근이 쉽다.
-28x28 이미지를 한줄로 편 784 x 55000개의 트레이닝 데이터, 10개의 라벨(클래스) x 55000
항상 데이터 셋을 위와 같이 가지고 있을 것이다.
mnist 는 55000장의 트레이닝 데이터, 10000장의 테스트 데이터, 5000장의 validation 데이터로 이루어진 데이터 셋
One hot Vector 를 np.argmax로 라벨로 바꿔준다.
random.permutation() : 쓰고자 하는 값을 다 쓰면서 순서를 랜덤화 함
~ 여담으로, 강의를 보다보니 느끼는데 이게 한 2년 정도 밖에 안된 강의 같은데도 텐서플로우 같은게 버전 차이가 꽤 나네요 ㅎㅎㅎ 발전속도가 엄청 빠른거 같아요.
파일 업로드가 안되어 dropbox에 AI study 폴더를 만들어 넣었습니다.ㅠㅠ
실습 2 진행중인데 from scipy.misc import imresize 에서 imresize가 죽어도 import가 안되네요ㅠㅠ
혹시 어떤 환경에서 진행중이신가요??
7/4 Overfitting을 막는 regularization
머신 러닝 전반에서 중요한 내용
Regularization : Over Fitting 을 막는 것
Over Fitting : 학습 데이터를 너무 믿는것. 트레이닝 데이터 성능은 올라가는데 테스트 데이터는 좋지 못 할때 일어난다고 본다.
완벽하게 Over Fitting을 막는 법은 없다. 대부분의 경우 underline function 에 해당하는 것을 알 수 없기 때문.
데이터에 노이즈가 있을 때 심해질 수 있다.
복잡한 함수나 여러 단의 딥러닝을 아무렇게나 쓰면 더 발생할 확률이 올라간다?
Generalization Performance 를 높이기 위한 목적. in-sample error 와 out of sample error 의 간극이 커지지 않게 하는 것.
오버 피팅을 막는 법 1) 더 많은 데이터를 구한다. (Data Augmentation 을 사용한다거나 등등) 2) 적절한 capacity(무게, 능력?) 를 갖는 모델을 쓴다. (무작정 레이어를 많이 쌓아서 하지 않는다.) 3) 여러 모델을 써서 평균을 낸다. (앙상블) 4) 테크닉 적인 해결책 : DropOut, DropConnect, BatchNorm
Limiting the Capacity: 구조적으로는 히든 레이어와 레이어 당 유닛의 숫자를 제한 하는 것. validation error 가 커지기 시작하며 오버 핏 되기 전에 Early Stopping 하는 것, Weight decay.
Weight decay : 파라미터가 너무 커지지 않게 하는 것.
DropOut : 학습할 때, 랜덤하게 한 레이어의 노드 몇개를 꺼버리는 것.
Drop Connect : Weight 를 끄는(0으로 바꾸는) 것.
Batch Normalization : 상당히 중요하고 많은 곳에서 쓴다. batch의 평균을 빼고 variance로 나눈다.
BN 의 장점 : 학습을 빨리 할 수 있다. DropOut 을 할 필요가 없다. L2 weight decay 를 줄일 수 있다. 등등, 여러모로 좋다.
Over Fitting 은 감?도 중요하다.
책 리뷰
Parameter Norm Penalties : 뉴럴넷의 weight가 너무 커지지 않게 하기 위해 제곱을 더하거나 절대값을 더하는 방식(????)
Dataset Augmentation : 머신러닝 모델을 generalize 하는데 최고의 방법은 많은 데이터를 트레이닝 하는 것. 라벨을 바꾸지 않으면서 이미지를 바꾼다거나, 노이즈 집어 넣는다거나 하는 방법을 쓸 수 있다.
Noise Robustness : 레이어 중간 중간 노이즈를 집어 넣는 것이 파라미터를 줄이는 것보다 나을 수 있다.
Multi-Task Learning : 한 번에 여러가지 분류를 하는 것. Deep Learning 의 특징상 이 경우 오히려 각 분류의 성능이 올라가는 경우가 있다 함.
Early Stopping
Parameter Tying and Parameter Sharing : 파라미터들을 묶어버리는 것
Sparse Representations : Sparse Weight / Sparse activation : (!한번 더 확인하기)
Bagging and Other Ensemble Methods : High Variance 를 Low Variance
Bagging : 평균을 내는 것 (??)
Boosting : 차이 만큼을 더하는 것.
DropOut
Adversarial : 입력단에 아주 작은 노이즈를 집어 넣었는데도, 아주 다른 결과값이 나오는 그런 예시가 Adversarial example이다.
파이썬 3.6 이고 윈도우에서 진행하고 있어요!
<overfitting을 막는 regularization 1>
-regularization? : overfitting을 막는 것 (*overfitting : underline function을 예측하는 것을 벗어나 과하게 학습데이터를 잘 맞추나 테스트데이터에서는 성능이 악화되는 모델이 만들어지는 것. 대부분 underline function을 모르기 때문에 in-sample error(학습데이터 에러)와 out-sample error(테스트 데이터 에러)의 차이인 generalization performance를 보고 판단한다. )
: 모든 머신러닝에 있어서 중요하다.
: deeper layer를 사용할 경우 성능이 좋아질 가능성이 있으나 overfitting이 발생할 가능성 또한 높아진다. -> 그래서 regularization이 필요하다.
-regularization 구체적인 방법들
1)data 많이: 데이터를 많이 모으거나, data augmentation을 통하여 데이터를 늘리는 것
2)적절한 모델 사용(??)
3)앙상블 : 여러 번 학습시켜 만든 모델들의 평균을 이용. 기본적으로 성능이 높아지기 때문에 대부분 다 앙상블을 사용하게 됨.
4)여러 테크닉 : Dropout, DropConnect, BatchNorm
5)Limiting the Capacity : (1)layer수 제한 (2)Early stopping (3)weight-dacay(parameter를 너무 크게 하지 않는 것)
*weight-dacay 잘 이해가 안가는 부분
*dropout : 학습할 때만 노드 몇개를 꺼버리는 것
*dropConnect : weight를 끄는 것
*Batch Normalizaiton : 가장 중요한 테크닉. 범용적으로 쓰임. : batch의 평균을 빼고 표준편차로 나누어 '정규화'하는 것이 핵심. : benefits : (1) Increase learning rate (2)remove dropout (3) remove L2 weight decay (4)Accelerate learning rate decay (5) Remove Local Response Normalization
<overfitting을 막는 regularization 2>
책 리뷰
Parameter Norm Penalties 제곱을 더하거나 절댓값을 더하는 식으로 penalty를 주는 것 (?)
data augmentation : 노이즈를 집어넣는 것도 한 방식이다.
Noise Robustness : layer 중간중간에 noise를 집어 넣는 것. weight에 노이즈 집어넣음. 혹은 Label-smoothing
Semi-Supervised Learning : representation을 찾는 것
Multi-Task Learning : 한 번에 여러문제를 푸는 것 : shared hiden node가 representation을 잘 찾아낸다. 이것이 성능을 향상시키는 핵심.
Parameter Tying and Parameter Sharing : 궁극적으로는 parameter 수를 줄이는 역할을 한다. : Parameter Tying : 입력이 다른데 비슷한 일을 할 때 어느 단의 layer를 공유하거나 하는 것. : Parameter Sharing : CNN이 일종의 파라미터 쉐어링.
Sparse Representation : 어떤 아웃풋의 대부분이 0이 되기를 원하는 것. : sparse weights : weight에 0이 많은 것 : sparse activations : activation에 0이 많은 것. 예 ) ReLU
Bagging and Other Ensemble Methods : Bagging : Low bais & high variance -> low bais & low variance : 평균을 내면 된다. 예)앞에서 설명한 ensemble
: Boosting : high bais & low variance -> low bais & low variace : sequential하게 붙이면 된다. 예 ) AdaBoost
dropout
Adversarial Training : 입력단에 굉장히 작은 노이즈를 넣음 -> 아웃풋이 변함 : 오버피팅이 존재한다는 것을 의미.
<overfitting을 막는 regularzation 질문>
책 리뷰 - 1. Parameter Norm Penalties에서 제곱을 더하거나 절댓값을 더하는 게 어떤 패널티가 된다는 것인지 잘 이해가 안 간다.
책 리뷰 - 4. 에서 representation을 찾는 것이 무엇인지 이해가 안 간다. : representation이란 쉽게 말해 모델의 성능을 나타내는 하나의 지표이다.
책 리뷰 - 7. 에서 아웃풋에 0이 많아지는 것이 regulation에서 왜 중요한 지 모르겠다.
책 리뷰 - 8. 에서 sequential하게 붙인다는 것이 어떻게 붙인다는 것인지 잘 모르겠다.
책 리뷰 - 9. adversarial example이 존재하면 오버피팅되어 있을 것이라고 짐작할 수 있다는 것까지는 이해를 했는데 그래서 그 이후에 어떻게 한다는 건지 잘 모르겠다. adversarial example이 없을 때까지 학습시킨다는 건가? 그냥 테스트용으로 끝인가?
weight-dacay가 잘 이해가 안 된다. 역전파에 쓰이는 수식과 딥러닝 전체적인 흐름을 제대로 이해하고 있지 못해서 그런 것 같다. E(w) = E0(w) + 1/2(람다)(서메이션i)wi^2 이 수식이 의미하는 바가 무엇인지 잘 이해가 안된다.
<Nature 논문으로 살펴보는 AlphaGo 알고리즘>
-Complexity of Go : 바둑은 10^360만큼의 경우의 수를 가져서 체스와는 달리 경우의 수를 모두 고려하는 알고리즘은 존재할 수 없다.
-Monte-Carlo Tree Search : 제일 상대방이 둘 것 같은 수를 가정한 후 search : selection - extension - simulation - backpropagation : 위 단계 각각에 딥러닝 기법이 사용된다.
-MCTS in AlphaGo : 1) Rollout policy, 2) SL policy network : 사람의 기보로 학습 : 3) RL policy network : 사람의 기보 + 알파고 기보, value network를 학습할 때만 영향을 준다. : 4) Value network : 판세를 평가. 지금 판이 나에게 얼마나 좋은지 : selection, extension -> SL policy network : simulation, backpropagation -> rollout network, value network : value network -> RL network
-Training : Rollout Policy Net, Supervised Learning Policy Net, Reinforcement Learning Police Net, Value Nedt
-Input feature : 기존의 바둑에 대한 지식(어디에 두는 게 좋은지 등)을 이용하여 Input에 depth를 준 것.
-Training policy nets (1)Rollout/ SL Network : policy "gradient" Reinforcement Learning (수식 이해 필요) (2)Reinforcement Learning(RL) Network : 이겼을 때 1 졌을 때 -1 (수식 이해 필요) (3)Value Network : 사람 기보만 가지고 하면 오버피팅되서 알파고끼리 둔 데이터를 더함. (수식 이해 필요)
-Execution phase (1)Selection Rule : 노드 s에서 어떤 화살표(s,a)를 선택할 지 고르는 것. (상태 s에서 어떤 행동 a를 할 지 고르는 것) : 이전의 확률에 비례하나 반복된 방문과 함께 감소하는데 이는 탐색을 위함이다.
(2)Expansion Rule : 카운트가 임계치를 넘으면(어떤 노드에 많이 방문되면) 다음 상태가 트리에 추가 된다.
-edge가 가지는 정보 (1)p(s,a) (2)Nv(s,a), Nr(s,a) : value net과 rollout net의 평가의 개수 (3)Wv(s,a): value net에서 임계치가 넘었을 때 이길 것 혹은 질 것이라고 평가한 값, Wr(s,a): 끝까지 다 해봐서 얻은 스코어
-다음 노드의 최종 선택은 엣지가 가지는 정보 네가지를 다 고려해서 정해진다.
-결과 : 성능이 좋고, 알고리즘만큼 중요했던 것이 분산 컴퓨팅 기술.
-자신의 도메인에서 기존의 문제푸는 방법론에 인공지능을 잘 섞어서 새롭고 뛰어난 방법론을 만드는 것이 좋은 연구 방향인 것 같다.
7/5 Nature 논문으로 살펴보는 AlphaGo 알고리즘
딥 마인드
딥 러닝도 중요하지만, Monte-Carlo Tree Search(MCTS) 를 많이 수행하고 그렇게 수행하기 위해 분산 GPU 를 사용하는 등등. 딥 러닝과 관련 없어 보였던 기존 방법론들을 딥 러닝에 중요한 부분들에 적용시켰다는 점에서 뛰어난 논문.
Complexity of Go : 엄청난 복잡도로 경우의 수를 모두 고려할 수는 없다.
MCTS : 나와 상대방이 번갈아가며 수를 둘때, 가장 가능성 있는 것을 찾는 가지 트리
MCTS in AlphaGo 1) Rollout policy : 사람의 기보로 학습 , Layer가 얇다, 빨리 빨리 수를 둬야 할때. selection, expansion. 2) SL policy network : 사람의 기보로 학습 , 조금 더 Deep 하다, 한 수를 보다 신중히 둬야 할 때. simulation, backpropagation. 3) RL policy network : 사람 기보 + 알파고 끼리의 학습. Value Network에만 활용. 4) Value Network : 판세를 평가하는 네트워크. 판의 방향을 정함. simulation, backpropagation
-- 1,2는 상대방의 수에 응수, 3,4는 자기자신의 평가
Training
Input feature
Training Policy net
Computational Power : Run Time에도 많은 서치를 위해 큰 컴퓨팅 파워 씀.
Execution Phase
Result : Distributed AlphaGo 의 성능이 압도적(분산이 중요하다.)
7/6 [실습] 기본 Tensorflow 문법 실습
-텐서 플로우는 기본적으로 설계도를 만든다는 느낌. computational graph를 그리고, 그걸 돌리는 키가 세션
타입과, 세션의 run 을 통해서 value를 확인.
텐서플로우에서 코딩을 하면 블록쌓기를 하듯이, 아래에 있는 레이어들을 차곡차곡 쌓아서, 윗단에서 표현해준다.
학습시키고 싶은 파라미터를 Variable 이라는 타입으로 처리. convolution filter 같은 것이 예시. 가우시안 분포에서 값을 뽑아 초기화.
플레이스홀더 : 입구? 어떤 입출력 값들이 들어갈 통로??
이 후 오퍼레이터를 정의
고정된 값인 Constant, 변하는 값(학습되는 값?)인 Variable, 학습데이터를 집어 넣어주는 Placeholder, 행동을 수행하는 Operator
7/7 [실습] Logistic Regression으로 숫자 분류기를 구현하기
Logistic Regression 은 분류 문제를 풀 수 있는 가장 간단한 방법론
Cross entropy (CE)
Squared Loss Function
pred 에 정답이 맞았는지 아닌지에 대한 데이터, accr 에 pred 평균을 넣어 정답률을 계산.
<nature 논문으로 살펴보는 AlphaGo 알고리즘 질문>
Training policy 에 나온 수식들
selection Rule에 나온 수식들
그래서 어떤 구조로 인공지능이 사용된 것인지? 알고리즘의 전체적인 틀이 안 잡힌다.
<MNIST 데이터셋 활용하기>
-(row : 데이터 개수, col = 차원) : 이 때 차원은 행렬을 한 줄로 편 벡터를 사용한다. 예) 28 x 28 이미지 => 784 크기의 벡터
<기본 tensorflow 문법 실습>
-tensorflow : '설계도'같은 것 : 'computational graph'를 만듬. : 블록쌓기 하듯이 밑단부터 쌓은 다음 윗단을 call 하는 구조를 가지며 이 구조가 장점.
-session : 그걸 돌리는 키 : sess.run() : 어떤 값을 넣었을 때 반드시 session을 통해 돌려야 원하는 대로 나옴.
-constant
-variable : 학습시키고 싶은 파라미터 (weight, bias) : 반드시 초기화 시켜주어야 함 : tf.global_variables_initializer()
-placeholder : 입력, 출력값을 넣을 통로/입구를 선언하는 것. : [데이터개수, 데이터의 차원]
-operation : +, x, CNN, activation 등 원하는 연산을 넣는다.
-feed-dict : placeholder로 만든 통로에 실제 데이터를 집어넣는 명령어
<Logistic Regression으로 숫자 분류기 구현하기>
-분류 문제를 풀 수 있는 가장 간단한 방법론
-cross entropy(CE) loss function을 이해하는 것이 중요
-cost function을 줄여서 목적을 달성하고자 하나 비용 함수값이 줄어든다고 하여서 반드시 목적을 달성할 수 잇는 것은 아니다. 내 문제에 맞는 비용함수를 디자인하고 최적화하는 것이 중요하다.
-일반적으로 많이 사용하는 CE loss function과 squared loss function의 차이를 알면 좋다.
-CE : 확률분포 p(target distribution)와 q(estimate distribution) 사이의 거리 : 원래 둘 간의 거리를 알려면 symmetry해야 한다. 즉, H(p,q)와 H(q,p)가 같아야 한다. : 현재 function H(p,q)는 symmetry가 없어서 거리 개념은 아니지만 거리와 비슷한 의미를 같는다.
: *softmax approximation : 뉴럴넷에서 나온 값에 exp()을 취하고 전체의 합으로 나누어줌 : 0과 1사이의 값이 됨, 합쳐서 1이 됨 -> 확률로 만들어준 것. : target은 one-hot coding이기 때문에 자연스럽게 확률로 볼 수 있음. : target 확률과 estimation 확률 간의 거리를 줄이는 개념.
: target이 1이 되는 클래스에 해당하는 estimate의 숫자만 높이고 다른 것들은 0이 되어 고려하지 않게 됨. : 분류에서는 제일 큰 숫자가 들어간 것만 고려하기 때문에 위의 메커니즘이 가능해짐.
*squared loss function과의 차이 : 뉴럴넷이 뱉어내는 모든 숫자를 바꾸어주려고 함. : 모든 것을 다 맞추는데 관심 : 이 부분이 CE와의 큰 차이이다.
-f(x) = softmax(Wx+b) : w : 784 x 10 : b = 1 x 10
-loss function을 입력으로 받는 cost function을 만들고 session에서 그 cost function(optimizer)만 call해주면 됨.
-activation : 100 x 10 output에서 가장 큰 것들만 골라서 100 x 1 벡터를 만듬
7/8 스터디
receptive field : 필터가 한번에 보는 영역
DropOut : 파라미터들이 동화되는 것을 방지?? 몇몇 노드가 과한 영향력을 지니는 것을 방지??
Semi-Supervised Learning 에서의 representation : 성능을 나타내는 지표. 주어진 데이터의 근간이 되는 전체 모델링을 잘하는게 representation을 잘하는 것.
7/1 4가지 CNN 살펴보기: AlexNET, VGG, GoogLeNet, ResNet Revolution of Depth -> Layer 를 Deep 하게 쌓음과 동시에 성능을 좋게하기 위해서는??
AlexNet
파라미터의 수를 파악하는 것이 중요
GPU의 성능 때문에 Layer가 나뉠 수 있다.
ReLU(Rectified Linear Unit)
LRN (Local Response Normalization) : 실제 뉴런의 측면 억제에 영감을 받은 기법 --> 일정 부분만 더 뚜렷하게 강조. 측면 억제 또한 경계와 같은 부분을 명확히 지각하기 위한 신경 반응이라고 함.
Regularization in AlexNet
파라미터 수 계산을 잘 해야한다.
VGG
GoogLeNet -22 레이어
Inception v4
ResNet