-
이번 강의에서는 신경망에서 널리 쓰이는
Softmax Classifier에 대해 이야기해보겠습니다
-
이번 강의에서는 신경망에서 널리 쓰이는
Softmax Classifier에 대해 이야기해보겠습니다
-
이번 강의에서는 신경망에서 널리 쓰이는
Softmax Classifier에 대해 이야기해보겠습니다
-
한 자리 숫자 손글씨 이미지가 있다고 가정해 봅시다
-
한 자리 숫자 손글씨 이미지가 있다고 가정해 봅시다
-
각 이미지를 0에서 9사이의
숫자로 구별해보려고 합니다
-
각 이미지를 0에서 9사이의
숫자로 구별해보려고 합니다
-
총 10개의 카테고리가 되는거죠
-
이 경우는 분류 문제이므로
-
로지스틱 회귀모델을 사용할 수 있을 것입니다
-
이 로지스틱 회귀모델은 입력을 받고
선형 모델과 활성값을 이용하여
-
이 로지스틱 회귀모델은 입력을 받고
선형 모델과 활성값을 이용하여
-
0 인지 1인지 예측하는데 사용할 수 있는
하나의 출력을 이끌어냅니다
-
0 인지 1인지 예측하는데 사용할 수 있는
하나의 출력을 이끌어냅니다
-
하지만 우리의 문제에서는
10개의 레이블이 필요합니다
-
그러므로 이렇게 10개의 출력이
더 자연스럽습니다
-
그러므로 이렇게 10개의 출력이
더 자연스럽습니다
-
각 출력은 Y가 0또는 1이 될
확률을 의미합니다
-
각 출력은 Y가 0또는 1이 될
확률을 의미합니다
-
어떻게 이것을 구현할까요?
-
하나의 출력이 아닌 10개의 출력을 위해서
어떻게 신경망을 구현할까요?
-
하나의 출력이 아닌 10개의 출력을 위해서
어떻게 신경망을 구현할까요?
-
우리는 출력값 행렬을 만들기 위해
행렬곱셈을 이용할 것입니다
-
우리는 출력값 행렬을 만들기 위해
행렬곱셈을 이용할 것입니다
-
앞에서 우리는 N x 2 행렬을 N x 1 행렬로 만들기 위해
2 x 1 행렬을 사용했습니다
-
앞에서 우리는 N x 2 행렬을 N x 1 행렬로 만들기 위해
2 x 1 행렬을 사용했습니다
-
간단한 방법으로
-
이 2는 같으므로 상쇄시키고
-
이 2는 같으므로 상쇄시키고
-
결국 이 행렬곱의 출력값은 N x 1 행렬이 됩니다
-
여기서 문제는
10개의 출력을 만들고 싶을 때
-
여기서 문제는
10개의 출력을 만들고 싶을 때
-
가중치 행렬의 사이즈를
어떻게 설정해야 하는가 하는 것입니다
-
이 경우 입력값 x는 2개이고
-
이 경우 입력값 x는 2개이고
-
N x 10 행렬을 만들고 싶다고 칩시다
-
W의 행렬 사이즈는 무엇일까요?
-
여기 2는 이 2와 같아야 합니다
-
따라서 2에
-
우리는 10을 만들고 싶으니까
-
이러면 출력이 10개가 되겠죠
-
간단히 말해 우리의 선형 모델에서
그냥 여기의 가중치값을 이용할 수 있습니다
-
간단히 말해 우리의 선형 모델에서
그냥 여기의 가중치값을 이용할 수 있습니다
-
입력 크기가 M이라 가정하면
우리가 필요한 것은 M x 10의 행렬 W입니다
-
입력 크기가 M이라 가정하면
우리가 필요한 것은 M x 10의 행렬 W입니다
-
그러면 10개의 출력이 나오겠죠
-
이제 다음 문제는
어떻게 이 출력값들의 확률을 계산하는지입니다
-
이제 다음 문제는
어떻게 이 출력값들의 확률을 계산하는지입니다
-
이를 위해 우리는 아주 유명한 함수인
Softmax를 사용할 것입니다
-
이를 위해 우리는 아주 유명한 함수인
Softmax를 사용할 것입니다
-
이것이 바로 Softmax 등식입니다
-
Softmax의 원리는 주어진 Z 숫자들을
0에서 1 사이의 값들로 만드는 것입니다
-
Softmax의 원리는 주어진 Z 숫자들을
0에서 1 사이의 값들로 만드는 것입니다
-
Softmax의 출력값은 인덱스 j의 확률이 됩니다
-
Softmax의 출력값은 인덱스 j의 확률이 됩니다
-
어떻게 동작하는지 이해를 돕기 위해
한가지 예를 들어볼 텐데요
-
어떻게 동작하는지 이해를 돕기 위해
한가지 예를 들어볼 텐데요
-
입력 X에 대해 선형연산을 하고
-
Scores 또는 Logits라고 하는
3개의 숫자를 만들어냅니다
-
Scores 또는 Logits라고 하는
3개의 숫자를 만들어냅니다
-
선형이기 때문에 어떤 숫자든 될 수 있습니다
-
2.0, 1.0, 0.1등이 될 수 있죠
-
이 숫자들(Logits)에 Softmax를 적용하면
-
각 인덱스에 대해 아주 좋은 확률을 얻을 수 있습니다
-
각 인덱스에 대해 아주 좋은 확률을 얻을 수 있습니다
-
각 인덱스에 대해 아주 좋은 확률을 얻을 수 있습니다
-
예를 들면, 0.7은 Y가 0이 될 확률입니다
-
여기서 각 값들은 확률을 의미하기 때문에
각 값들을 모두 합하면 1이됩니다
-
여기서 각 값들은 확률을 의미하기 때문에
각 값들을 모두 합하면 1이됩니다
-
여기서 각 값들은 확률을 의미하기 때문에
각 값들을 모두 합하면 1이됩니다
-
아래 주소의 코스에 나오는 슬라이드를 이용하여
Softmax를 다시 한번 요약하자면
-
아래 주소의 코스에 나오는 슬라이드를 이용하여
Softmax를 다시 한번 요약하자면
-
우리의 입력값에서 선형모델을 적용할 수 있고
-
우리의 입력값에서 선형모델을 적용할 수 있고
-
선형모델은 어떤 숫자값 Logit을 만들어냅니다
-
그리고 여기 Softmax를 적용하면
-
그리고 여기 Softmax를 적용하면
-
확률값들을 얻어낼 수 있습니다
-
다음 단계는 주어진 레이블에 대한 손실을 계산하는 것입니다
-
다음 단계는 주어진 레이블에 대한 손실을 계산하는 것입니다
-
이 경우에는 레이블은 원-핫 레이블을 말합니다
-
이 경우에는 레이블은 원-핫 레이블을 말합니다
-
만약 Y가 0이면 레이블은 1, 0, 0이 된다는 뜻입니다
-
이것이 바로 원-핫 포맷입니다
-
손실값을 계산하기 위해서
-
우리가 계산한 y햇과 실제 y에
크로스 엔트로피를 사용합니다
-
우리가 계산한 y햇과 실제 y에
크로스 엔트로피를 사용합니다
-
크로스 엔트로피는 이 등식으로 계산할 수 있습니다
-
크로스 엔트로피는 이 등식으로 계산할 수 있습니다
-
-Y에 Y햇의 로그값을 곱한 것이죠
-
크로스 엔트로피는 기본적으로
Y와 Y햇의 분포 차이를 계산합니다
-
크로스 엔트로피는 기본적으로
Y와 Y햇의 분포 차이를 계산합니다
-
전체 손실은 전체 크로스 엔트로피의 합이 됩니다
-
전체 손실은 전체 크로스 엔트로피의 합이 됩니다
-
간단한 예제 소스코드를 이용해서
어떻게 크로스 엔트로피를 구하는지 알아봅시다
-
간단한 예제 소스코드를 이용해서
어떻게 크로스 엔트로피를 구하는지 알아봅시다
-
간단한 예제 소스코드를 이용해서
어떻게 크로스 엔트로피를 구하는지 알아봅시다
-
이 예제에서는 간단한 numpy 배열을 이용할 겁니다
-
이 예제에서 우리는 레이블 Y을 표현하기 위해
원-핫 표현방식을 사용합니다
-
여기서는 1, 0, 0이 Y가 됩니다
-
여기서는 1, 0, 0이 Y가 됩니다
-
예측 1에는 우리가 예제에서 사용했던 값인
0.7, 0.2, 0.1을 할당합니다
-
예측 1에는 우리가 예제에서 사용했던 값인
0.7, 0.2, 0.1을 할당합니다
-
여기서는 우리의 예측이 아주 좋은데요
-
Y가 0이 될 확률이 매우 높기 때문입니다
-
Y가 0이 될 확률이 매우 높기 때문입니다
-
다른 예측과 비교해보기 위해서
0.6의 값을 가진 틀린 예측을 준비해봤습니다
-
다른 예측과 비교해보기 위해서
0.6의 값을 가진 틀린 예측을 준비해봤습니다
-
Y는 2가 될텐데요
-
Y가 2가 될 확률은 매우 높겠지만
-
이 값(0.1)은 매우 낮죠
-
그러므로 이 예측은 틀렸습니다
-
손실을 계산해보면
여기 값은 작고 여기 값은 큽니다
-
손실을 계산해보면
여기 값은 작고 여기 값은 큽니다
-
손실을 계산해보면
여기 값은 작고 여기 값은 큽니다
-
이게 바로 우리가 예상했던 바입니다
-
여기 크로스 엔트로피를 적용하면
-
-YLog(Y_pred)이 됩니다
-
-YLog(Y_pred)이 됩니다
-
여기서는 작은 값이 나오겠죠
-
두 번째 예측에 대해
크로스 엔트로피 손실을 계산해보면
-
두 번째 예측에 대해
크로스 엔트로피 손실을 계산해보면
-
큰 값이 나옵니다
-
어떤 원리일까요?
-
이건 아주 직관적이라고 할 수 있는데요
-
왜냐면 우리는 원-핫값 Y를 준비했고
-
이것을 곱하고 나면 우리는
여기 2개의 값만 신경 쓰면 됩니다
-
이것을 곱하고 나면 우리는
여기 2개의 값만 신경 쓰면 됩니다
-
나머지는 무시하면 됩니다
왜냐면 원-핫을 곱했으니까요
-
나머지는 무시하면 됩니다
왜냐면 원-핫을 곱했으니까요
-
그래서 -1에 log(0.7)을 곱하면
-
아주 작은 값이 나오는거죠
-
log(0.1)은 큰 값이 나옵니다
-
이것이 우리가
크로스 엔트로피 값을 계산하는 방법입니다
-
PyTorch에서 손실값을 구하려면
CrossEntropyLoss를 사용하면 됩니다
-
PyTorch에서 손실값을 구하려면
CrossEntropyLoss를 사용하면 됩니다
-
PyTorch에서 손실값을 구하려면
CrossEntropyLoss를 사용하면 됩니다
-
우리는 예측값과 실제값을 이용하여
이 함수를 호출해서 손실값을 계산할 수 있습니다
-
우리는 예측값과 실제값을 이용하여
이 함수를 호출해서 손실값을 계산할 수 있습니다
-
우리는 예측값과 실제값을 이용하여
이 함수를 호출해서 손실값을 계산할 수 있습니다
-
PyTorch에서 이 CrossEntropyLoss() 함수를 사용할 때
-
두 가지를 주의해야합니다
-
첫 번째, 이 Y는 원-핫이 아닙니다
-
클래스입니다
-
여기서는 0, 1, 또는 2의 값이 될 수 있습니다
-
더 편리한 방법이죠
-
두 번째로, 이전 예제와 다른 점은
이 예측값은 Softmax가 아니라는 것입니다
-
두 번째로, 이전 예제와 다른 점은
이 예측값은 Softmax가 아니라는 것입니다
-
그냥 바로 logits 값들을 여기 집어넣을 수 있습니다
-
그 이유는 이 구현체 CrossEntropyLoss 안에
-
이미 Softmax가 포함되어 있기 때문입니다
-
그러므로 손실값을 계산하기 위해
-
Softmax를 적용할 필요가 없습니다
-
이것도 아주 편리하죠
-
기본적으로 크로스 엔트로피는
-
아주 사용하기에 편리합니다
-
그냥 클래스를 넘기거나
-
또는 logits를 넘기면 됩니다
-
이 예제에서 말하고자 하는 것은
-
0 클래스와 logits 값이 있을 때
-
Y값과 Y_pred값을 사용하면
-
손실값을 계산할 수 있다는 것입니다
-
예상했던 대로
-
첫 번째는 손실값이 아주 작으므로 옳은 예측이고
-
두 번째는 손실값이 크므로 틀린 예측입니다
-
두 번째는 손실값이 크므로 틀린 예측입니다
-
두 번째는 손실값이 크므로 틀린 예측입니다
-
PyTorch의 또 다른 장점으로는
-
PyTorch의 또 다른 장점으로는
-
배치모드(batch mode)를 사용할 수 있다는 것입니다
-
다수의 레이블과 예측을 준비합니다
-
다수의 레이블과 예측을 준비합니다
-
이 예제에서는 첫 번째 레이블 값이 2, 0, 1입니다
-
다시 말하자면, Y는 원-핫이 아니라 클래스입니다
-
우리는 이 3개의 다른 예측이 필요합니다
-
첫 번째 예측은 이것인데
-
옳은 예측입니다
-
이것이 두 번째 예측인데
-
이것도 옳은 예측입니다
-
이것은 세 번째 예측인데
-
이것도 또한 옳은 예측입니다
-
Y_pred1은 좋은 예측입니다
아주 좋아요
-
Y_pred2는 그리 좋은 예측은 아닙니다
-
이게 그 예측인데요
틀렸고
-
이것도 틀렸고
-
이것도 틀렸네요
여러분이 손실을 계산할 때
-
이게 낮은 값이 나오길 기대할 텐데요
-
사실 이 값은 높은 값이 나오게 됩니다
-
사실 이 값은 높은 값이 나오게 됩니다
-
그러므로 여러분이 손실값을 계산할 때
-
우리의 Softmax classifier에서 아주 잘 동작하는
손실 함수를 이끌어낼 수 있습니다
-
우리의 Softmax classifier에서 아주 잘 동작하는
손실 함수를 이끌어낼 수 있습니다
-
PyTorch에는 Softmax를 이용하는 다른 방법이 있는데요
-
바로 NLLLoss를 이용하는 방법입니다
-
연습문제로, 여러분은 Softmax classifier를 위해
-
어떻게 NLLLoss를 사용하는지 알아볼 수 있습니다
-
간단한 힌트를 주자면
-
NLLLoss와 함께 LogSoftmax를 사용하면 됩니다
-
마치 우리가 크로스 엔트로피를 사용할 때와
-
마찬가지로 말이죠
-
이제 우리는 Softmax classifier를
-
실제 문제 해결에 사용할 수 있습니다
-
주어진 28 x 28 픽셀의 이미지를
-
0~9 사이의 값으로 구분해 낼 수 있습니다
-
이 이미지는 한자리 숫자 손글씨이기 때문입니다
-
이 이미지는 한자리 숫자 손글씨이기 때문입니다
-
다시 말해, 입력 사이즈가 28 x 28이면
-
총 784 픽셀이 됩니다
-
우리는 신경망을 784 픽셀을 입력값으로 받는
-
신경망으로 디자인할 수 있습니다
-
10개의 출력을 만들 예정이구요
-
첫 번째 입력을 입력 레이어이라 하고
-
출력 부분을 출력 레이어이라 합니다
-
중간부는 안쪽과 바깥쪽으로부터 숨겨져 있기 때문에
-
은닉 레이어이라고 합니다
-
여러분은 만들고 싶은 수만큼의
-
은닉 레이어을 만들 수 있습니다
-
각 은닉 계층이 몇 개의 노드를 가지는지도
-
여러분이 정할 수 있습니다
-
예를 들어
-
4개의 은닉 계층을 만들고
-
각 계층의 노드 수가 520, 320, 240, 120일 때
-
이를 PyTorch를 이용하여 구현하자면
-
우리는 입력 크기와 출력크기에 기반하여
-
각 선형 요소를 만듭니다
-
예를 들어
-
여기 은닉 노드는 520입니다
-
이 첫 번째 선형 요소는 784의 입력을 받고
-
520의 출력을 만들어냅니다
-
두 번째 레이어에서는 520의 입력을 받고
-
320의 출력을 만들어냅니다
-
이런식으로 출력값은 다음 레이어의 입력값이 됩니다
-
마지막으로 우리가 해야 하는 것은
-
10개의 출력을 만드는 것입니다
-
이것은 고정된 값이죠
-
요약하자면, 여기 784와 10의 값은 고정된 값입니다
-
중간부에서는 여러분이 임의로 값을 정할 수 있습니다
-
이렇게 요소들을 만들고 나면
-
forward 함수에서 이것들을 연결해야 합니다
-
입력 X는 벡터 1 x 28 x 28이 됩니다
-
1가지 색깔을 가진 28 x 28 이라는 뜻입니다
-
1가지 색깔을 가진 28 x 28 이라는 뜻입니다
-
우선 이 명령어를 사용하여
이 벡터를 n, 784로 변환합니다
-
우선 이 명령어를 사용하여
이 벡터를 n, 784로 변환합니다
-
그리고 이를 첫 번째 레이어로 넘깁니다
-
그리고 다시 이를 두 번째 레이어로 넘기고
-
이를 반복합니다
-
마지막 계층에서는
-
어떤 활성 함수도 적용할 필요가 없습니다
-
우리는 크로스 엔트로피 함수를 위해
-
logits를 사용할 것이기 때문입니다
-
여기서 우리는 criterion으로
-
CrossEntropyLoss를 사용합니다
-
배치에서는
-
X를 뜻하는 data
그리고 target 값을 얻어냅니다
-
이를 우리의 모델에 넘기면
-
출력, 예측값을 만들어낼 수 있습니다
-
이 예측값과 target을 이용하여
-
loss값을 얻어낼 수 있습니다
-
크로스 엔트로피를 이용하는거죠
-
그리고 역전파를 적용하고
-
가중치를 업데이트하면 끝입니다
-
이것은 전체 소스코드인데요
첫 번째 부분에서
-
우리는 DataLoader를 사용하고 있습니다
-
디렉토리를 정의하고, 데이터를 불러옵니다
-
이 부분은 우리의 네트워크 부분인데요
-
이렇게 컴포넌트들이 있고
이를 다함께 연결하고 있습니다
-
끝으로, 아까 말했듯이
-
우리는 어떤 활성화 함수도 사용하지 않습니다
-
이 클래스를 사용하여 우리의 모델을 정의하고
-
크로스 엔트로피를 이용하여 criterion을 정의합니다
-
그리고 옵티마이저를 위해 SGD를 사용합니다
-
그리고 옵티마이저를 위해 SGD를 사용합니다
-
트레이닝 싸이클에서
-
우리는 train_loader를 사용하여
-
각 배치사이즈에 대해 data, target를 받아옵니다
-
여기서 배치 사이즈는 64로 주어져 있네요
-
이 data를 model로 전달하고
-
output과 target을 이용하여 loss를 계산하고
-
output과 target을 이용하여 loss를 계산하고
-
이것들을 실행합니다
-
여기서는
-
epoch 값과 현재 loss 등을 출력합니다
-
현재 과정을 이해할 수 있는 아주 중요한 정보죠
-
우리의 트레이닝(모델)이 잘 된 것인지
어떻게 알 수 있을까요
-
우리의 트레이닝(모델)이 잘 된 것인지
어떻게 알 수 있을까요
-
우리는 정확도를 측정해야 합니다
-
정확도를 측정하는 최고의 방법은
-
데이터셋을 두 개로 나누는 것입니다
-
하나는 트레이닝이라고 부르고
-
다른 하나는 테스팅이라 하겠습니다
-
우리의 모델을 만들기 위해서
-
트레이닝 데이터셋만 사용합니다
-
이 모델을 평가하기 위해서는
-
이 모델을 만들 때 전혀 사용되지 않은
테스트셋을 사용합니다
-
DataLoader를 잘 보면
-
두 개의 다른 DataLoader가 있다는 것을
알 수 있습니다
-
하나는 train_loader이고
-
다른 하나는 test_loader입니다
-
우리는 트레이닝 싸이클에서
-
우리 모델을 트레이닝 하기 위해
train_loader만 사용합니다
-
트레이닝이 끝나면
-
우리 모델을 테스트 하기 위해
이 test_loader를 사용합니다
-
이렇게 model에 값을 넘기고 나면
-
우리는 test_loss값을 계산할 수 있습니다
-
여기서 torch.max 함수를
이용하여 예측해보면
-
여기서 torch.max 함수를
이용하여 예측해보면
-
예측된 값과 target.data를 비교하여
-
이 중에 몇 개가 맞는지 알 수 있습니다
-
총 합계를 계산하고
-
이를 전체 수로 나누면
-
얼마나 많은 예측이 맞았는지
-
백분율을 계산할 수 있습니다
-
max 함수를 좀 더 자세히 살펴봅시다
-
max 함수를 좀 더 자세히 살펴봅시다
-
이 예측값이 있다고 가정해 봅시다
-
이 max 함수는 2개를 반환합니다
-
가장 큰 값인 0.9와
그 숫자의 인덱스입니다
-
0, 1, 2이죠
2가 바로 0.9의 인덱스네요
-
그러므로 이 변수의 값은 2가 됩니다
-
여기서 이 출력값 예측을 위해
우리가 하고자 하는 것은
-
여기서 이 출력값 예측을 위해
우리가 하고자 하는 것은
-
classification
즉 인덱스를 알아내는 것입니다
-
classification
즉 인덱스를 알아내는 것입니다
-
인덱스 값만 알아내고 싶다면
그냥 이것만 사용하면 됩니다
-
이게 바로 우리가 인덱스를 알아내기 위해
[1]을 사용한 이유입니다
-
이렇게 정확도가 측정되는 것입니다
-
몇 개가 맞게 예측되었는지를 계산하고
-
이를 기반으로 백분율을 출력합니다
-
이것이 우리의 손실값들이구요
-
트레이닝에서, 이는 현재 epoch와 반복 수
각 상황에서의 백분율을 출력하는 좋은 방법입니다
-
트레이닝에서, 이는 현재 epoch와 반복 수
각 상황에서의 백분율을 출력하는 좋은 방법입니다
-
트레이닝에서, 이는 현재 epoch와 반복 수
각 상황에서의 백분율을 출력하는 좋은 방법입니다
-
트레이닝에서, 이는 현재 epoch와 반복 수
각 상황에서의 백분율을 출력하는 좋은 방법입니다
-
이것들은 트레이닝 손실입니다
-
이것은 아까 분리해뒀던 테스트셋을 이용한 테스트인데요
-
평균 손실이 약간 높긴 하지만
-
정확도는 아주 높습니다
-
간단한 신경망을 이용했는데도 97%입니다
-
만약 다중 레이블 예측이 필요하더라도
-
전혀 문제가 없습니다
-
그냥 CrossEntropyLoss를 사용하면 되거든요
-
마지막 레이어는 선형 출력을 할 것이고
-
이 출력들을 CrossEntropyLoss 함수로 넘기면
-
모든 게 해결됩니다
-
연습문제로, 우리는 이 URL에서 다운받을 수 있는
-
흥미있는 데이터를 활용하여
-
Softmax classifier를 만들어 볼 수 있습니다
-
물론 여러분이 이 데이터셋을 위한 DataLoader를
직접 구현해 볼 수도 있습니다
-
물론 여러분이 이 데이터셋을 위한 DataLoader를
직접 구현해 볼 수도 있습니다
-
물론 여러분이 이 데이터셋을 위한 DataLoader를
직접 구현해 볼 수도 있습니다
-
다음 강의에서는 아주 중요한 신경망인
-
합성곱 신경망에 대해 알아보겠습니다
-
합성곱 신경망에 대해 알아보겠습니다