-
[HandsOn] 17. 오토인코더와 GAN을 사용한 표현 학습과 생성적 학습- 내용 정리2[도서완독]Hands On Machine Learning 2022. 8. 26. 22:45
코드는 여기를 참고했다!
https://github.com/rickiepark/handson-ml2/blob/master/17_autoencoders_and_gans.ipynb
GitHub - rickiepark/handson-ml2: 핸즈온 머신러닝 2/E의 주피터 노트북
핸즈온 머신러닝 2/E의 주피터 노트북. Contribute to rickiepark/handson-ml2 development by creating an account on GitHub.
github.com
17.5 순환 오토인코더
(비지도 학습이나 차원 축소를 위해) 시계열, 텍스트와 같은 시퀀스에 대한 오토인코더를 만들려면 순환 신경망이 밀집 네트워크보다 더 나을 수 있음.
시계열, 텍스트를 차원축소한다는게 뭐지?
->시계열 구조를 갖는 28차원 벡터를 lstm으로 4차원으로 줄이는 것
혹은, 텍스트를 원핫 인코딩에서 임베딩 벡터를 쓰는 것
비지도 학습은??
-> 비지도는 라벨이 없는 것!
텍스트가 주어지고 특정 단어를 지운 뒤에 주변 단어로 지운 단어를 맞추기 하는 것
(저 위에 잡음 추가랑 비슷한 개념인듯)
시계열도 비슷한 개념!
인코더는 일반적으로 입력 시퀀스를 하나의 벡터로 압축하는 시퀀스 투 벡터 RNN임. 디코더는 반대로 벡터 투 시퀀스 RNN.
recurrent_encoder = keras.models.Sequential([ keras.layers.LSTM(100, return_sequences=True, input_shape=[28, 28]), keras.layers.LSTM(30) ]) recurrent_decoder = keras.models.Sequential([ keras.layers.RepeatVector(28, input_shape=[30]), keras.layers.LSTM(100, return_sequences=True), keras.layers.TimeDistributed(keras.layers.Dense(28, activation="sigmoid")) ]) recurrent_ae = keras.models.Sequential([recurrent_encoder, recurrent_decoder]) recurrent_ae.compile(loss="binary_crossentropy", optimizer=keras.optimizers.SGD(0.1), metrics=[rounded_accuracy])
타임 스텝마다 28차원을 갖는 시퀀스를 처리 가능.
뭔가 여기가 이해가 잘 안가는데...
패션 MNIST 데이터 (28,28) 의 각 이미지를 행의 시퀀스로 간주하여 처리할 수 있다(?)
각 타임 스텝에서 이 RNN은 28픽셀의 행 하나를 처리. 타임 스텝마다 입력 벡터를 주입하기 위해 디코더의 첫 층에 RepeatVector 층 을 사용.
-> 28차원인 하나의 관측치가 28개의 시간에 따라 주어져 있는 것임!
지금까지 오토인코더가 특성을 학습하도록 강제하기 위해 코딩층의 크기를 제한하여 과소완전으로 만들었는데, 입력 크기 또는 입력보다 큰 코딩 층을 두어 과대완전 오토인코더를 만들 수 있음.
17.6 잡음 제거 오토인코더
오토인코더가 유용한 특성을 학습하도록 강제하는 다른 방법은, 입력에 잡음을 추가하고 잡음이 없는 원본 입력을 복원하도록 훈련하는 것. 얀 르쿤이 석사논문에 언급했다고함... 얀르쿤 저세상 천재인듯...당연하지만....
잡음은 입력에 추가된 순수한 가우시안 잡음이거나, 드롭아웃처럼 무작위로 입력을 꺼서 발생시킬 수도 있음.
가우시안 잡음 층을 넣어서 해보자.
denoising_encoder = keras.models.Sequential([ keras.layers.Flatten(input_shape=[28, 28]), keras.layers.GaussianNoise(0.2), keras.layers.Dense(100, activation="selu"), keras.layers.Dense(30, activation="selu") ]) denoising_decoder = keras.models.Sequential([ keras.layers.Dense(100, activation="selu", input_shape=[30]), keras.layers.Dense(28 * 28, activation="sigmoid"), keras.layers.Reshape([28, 28]) ]) denoising_ae = keras.models.Sequential([denoising_encoder, denoising_decoder]) denoising_ae.compile(loss="binary_crossentropy", optimizer=keras.optimizers.SGD(learning_rate=1.0), metrics=[rounded_accuracy]) history = denoising_ae.fit(X_train, X_train, epochs=10, validation_data=(X_valid, X_valid))
가우시안 잡음이 섞인 이미지와 복원된 이미지 이렇게 효율적으로 이미지에서 잡음을 제거하는데 사용 할 수 있음!
17.7 희소 오토인코더
- 가능하면 코딩 층에서 출력값이 0이 아닌 노드의 개수가 적어지도록 만드는 오토인코더
좋은 특성을 추출하도록 만드는 다른 제약의 방식은 희소(sparsity) 인데, 이는 비용 함수에 적절한 항을 추가하여 오토인코더가 코딩 층에서 활성화되는 뉴런 수를 감소시키도록 만듬.
예를 들어 코딩 층에서 평균적으로 5% 뉴런만 활성화되도록 강제할 수 있음.
이렇게 하면 오토인코더가 적은 수의 활성화된 뉴런을 조합하여 입력을 표현해야 하므로, 코딩 층의 각 뉴런은 유용한 특성을 표현하게 된다고 한다,https://nlp.jbnu.ac.kr/AI2019/slides/ch05-5.pdf https://nlp.jbnu.ac.kr/AI2019/slides/ch05-5.pdf 간단한 적층 희소인코더를 만들고, l1 규제와 KL 발산을 이용해 규제해 보자.
먼저 적층 희소인코더를 만들자.
(코드는 전의 포스팅을 참조! sigmoid 함수를 사용하여 코딩값이 0~1이 되도록 만듬)
인코딩 층의 활성화에 대한 히스토그램을 출력해 보자.
왼쪽: 코딩 층에 있는 모든 활성화의 분포, 오른쪽: 각 뉴런의 평균 활성화 분포 이 히스토그램은 인코딩 층의 활성화에 대한 히스토그램인데, 코드는 위의 링크에서 확인 가능.
첫번째 히스토그램은, 코딩 층의 output에 대해 도표를 그린 것 같은데, 0과 1에 가까운 값이 전체적으로 더 많이 등장..
이는 시그모이드 함수가 0,1로 수렴하는 특성 때문.(맞겠지..)
코딩 층에 있는 뉴런의 활성화가 50%는 된다는 것 같음.
두번째 히스토그램은 평균적인 뉴런의 분포임. 대부분의 뉴런이 0.5에 가까운 평균 활성화를 가지고 있음.
두 히스토그램은 각 뉴런이 50% 확률로 0이나 1에 가까운 값에 활성화된다는 것을 보여줍니다.
하지만 일부 뉴런은 거의 항상 활성화됩니다(오른쪽 히스토그램의 오른쪽편).코딩 층에 l1 규제를 추가해 보자.
simple_encoder = keras.models.Sequential([ keras.layers.Flatten(input_shape=[28, 28]), keras.layers.Dense(100, activation="selu"), keras.layers.Dense(30, activation="sigmoid"), ]) simple_decoder = keras.models.Sequential([ keras.layers.Dense(100, activation="selu", input_shape=[30]), keras.layers.Dense(28 * 28, activation="sigmoid"), keras.layers.Reshape([28, 28]) ]) simple_ae = keras.models.Sequential([simple_encoder, simple_decoder]) simple_ae.compile(loss="binary_crossentropy", optimizer=keras.optimizers.SGD(learning_rate=1.), metrics=[rounded_accuracy]) history = simple_ae.fit(X_train, X_train, epochs=10, validation_data=(X_valid, X_valid))
코딩 층의 활성화 값에 l1 규제를 추가.
ActivityRegularization 층은 입력을 그대로 반환하면서, 훈련 손실에 입력의 절댓값의 합을 더함.
l1 norm을 사용하면 입력 이미지에서 불필요한 것을 제거하고 가장 중요한 코딩을 보전하도록 만듬.
l1 l2 기억이 안나서^^... 다른 블로그 글을 다시 읽고 왔다
https://steadiness-193.tistory.com/262
Regression - Regularization : L1 규제(Lasso), L2 규제(Ridge)
* 수학적 증명, 수식보단 기본 개념과 활용법에 초점을 맞춤 Regularization (정형화, 규제, 일반화) 모델이 과적합되게 학습하지 않고 일반성을 가질 수 있도록 규제 하는 것. 하늘색 선은 오버피팅
steadiness-193.tistory.com
전체 활성화의 90% 이상이 0.02보다 작음... 그리고 전체 뉴런의 대부분이 0~0.1 사이의 평균 활성화를 가짐.
희소성을 위해 KL 발산을 사용하여 0% 아니라 10% 희소성을 만들어 보자.
(코드는... 위의 링크 참조...)
전체 활성화의 약 70%가 0.1보다 작고, 전체 뉴런의 약 90%가 0.1~0.2 사이의 평균 활성화를 가짐.
17.8 변이형 오토인코더
ㅎㅎ... 설명을 잘해놓은 분이 계셔서 여기 링크를 공유하고 끝내겠음!
[핸즈온 머신러닝] 17장(3) - 변이형 오토인코더, Variational AutoEncoder
[AI/Hands-on ML] - [핸즈온 머신러닝] 17장(2) - 합성곱 오토인코더, 순환 오토인코더, 잡음 제거 오토인코더, 희소 오토인코더 [핸즈온 머신러닝] 17장(2) - 합성곱 오토인코더, 순환 오토인코더, 잡음
kdeon.tistory.com
'[도서완독]Hands On Machine Learning' 카테고리의 다른 글
[HandsOn] 18. 강화 학습- 내용 정리1 (1) 2022.09.19 [HandsOn] 17. 오토인코더와 GAN을 사용한 표현 학습과 생성적 학습- 내용 정리1 (0) 2022.08.23 [HandsOn] 16. RNN과 어텐션을 사용한 자연어 처리 - 내용 정리3 (0) 2022.08.19 [HandsOn] 16. RNN과 어텐션을 사용한 자연어 처리 - 내용 정리2 (0) 2022.08.18 [HandsOn] 16. RNN과 어텐션을 사용한 자연어 처리 - 내용 정리1 (0) 2022.08.16