Link
04-22 23:17
«   2021/04   »
        1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30  
Archives
Today
0
Total
1,491,516
관리 메뉴

꿈 많은 사람의 이야기

cs231n 2017 3강 정리 loss functions and optimization 본문

deep learning(딥러닝)

cs231n 2017 3강 정리 loss functions and optimization

오키여 이수진의 블로그 2018. 10. 31. 19:50
반응형

요즘 모두의 연구소에서 딥러닝 스터디에 참가하고 있습니다.

cs231n 강의를 참고해서 스터디 하고 있는데요 이걸 정리하려고 합니다.


1, 2강은 뭐 그냥저냥한 내용이니까 3강부터 정리하려고 합니다


3강은 loss function과 optimization의 내용입니다.

이 둘의 핵심을 알아보도록 하죠


시작!



먼저 지난 시간의 내용을 복습하고 넘어갑니다.

지난 시간에는 이미지 분류에 대해서 알아보았습니다.

그 중 이미지 분류가 왜 힘들고 쉽지 않은지에 대해서 알아보았죠.

조명, 변형, 은닉 등의 문제점 때문이었습니다.



그리고 CIFAR-10 데이터셋에 대해서도 알아보았습니다.

이후에 크로스 벨리데이션(cross validation), KNN을 알아보았습니다.

또 data-driven방식을 알아보았죠

그리고 데이터를 훈련시킬 때 train, test 2개로만 나누면 좋지 않다고 배웠습니다.

즉, train, validation, test 3개로 나눠서 test 셋은 마지막에 평가할 때 딱! 1번만 사용한다고 했습니다.



그리고 간단하게 linear classifier를 배웠습니다.

x는 이미지, w는 가중치(weight)를 줘서 score(점수)를 뽑아냈죠.

그 점수가 높으면 만약 강아지 점수가 높으면 해당 분류기는 들어온 x이미지를 강아지로 인식하는 것이죠.

그리고 이렇게 하나의 분류기를 사용하면 이미지 분류가 잘 안된다는 것을 배웠습니다.

예를 들어 위 사진의 아래에서 말머리가 2개로 나타나거나, 자동차는 빨간색을 위주로 보여준다거나 하는 문제입니다.



자 이제 본격적으로 들어가보죠


우리는 앞서 linear classifier를 배웠습니다. 그리고 여기서  W값을 준다는 것을 배웠죠.

근데 여기서 문제는 이겁니다. 이 W가 좋은 것이냐??

이걸 알아야하죠. 실제로 위 사진에서 예시를 보면

고양이는 2.9점입니다. 하지만 강아지는 8.02로 훨씬 높네요

그래도 자동차는 분류를 잘했습니다.

하지만 개구리 그림에서는 심지어 개구리 점수가 -4.34입니다. 거의 최악이죠

이럴 때 score는 매우 안좋게 나왔다는 거고 이거에 영향을 주는 W는 매우 안좋다고 말할 수 있겠죠?


즉, 이 W가 좋다 아니면 안좋다! 라고 '정량화'할 수 있는 것이 필요합니다

이것이 바로 loss function입니다.

이것은 '이 W는 얼마만큼 안좋아!'라고 알려주는 겁니다. '좋아!'가 아니라 '안좋아!'입니다.


그리고 안좋으면 좋은 쪽으로 찾아가야겠죠?

이 과정을 optimization이라고 합니다.

이번장에서는 이 2가지를 핵심적으로 봐봅니다.




데이터가 10개면 너무 많으니까

고양이, 자동차, 개구리 3개로 줄여보죠



수학 공식들이 튀어나옵니다.

차분히 봐보죠!

x는 이미지입니다., y는 카테고리(라벨값)입니다.

라벨값이라는 것은 고양이는 0, 자동차는 1, 개구리는 2 이런식의 라벨값을 뜻합니다.


그리고 아래 일반적인 loss를 구하는 방법이 나와있습니다.


간단합니다. 각 i 카테고리별(0,1,2 등) loss를 각각 구합니다.

그리고 그걸 다 더합니다.

마지막으로 개수로 나눠 평균값을 만듭니다.


이게 최종 loss가 됩니다

간단하죠?

자 이걸 이용한  loss를 봐봅시다




첫 번째로 알아볼 loss는 서포트 벡터 머신(SVM) loss입니다.

이 loss는 hinge loss(힌지 로스)라고도 불리웁니다.


위에서 언급한 기본적인 loss와 비슷하게 생겼지만 조건이 생겼죠!


sj는 정답이 '아닌' 클래스 score입니다.

syi는 '정답' 클래스 score이죠.


조건을 보면

'만약, '정답'클래스(syi)가 정답이 아닌 클래스(sj) + safety margin(여기선 1)값보다 더 크면! loss는 0이다! 라는 것입니다.

그리고 '만약, 위에 조건이 아니면! => 정답이 '아닌' 클래스(sj) - 정답클래스 + safety margin(여기선 1)의 값을 loss로 가져라 라는 뜻이죠


간단합니다.


만약에 정답 클래스가 정답이 아닌 클래스보다 safety margin보다 크면 그냥 그건 loss가 0이라는 것이죠

loss가 0이라는 것은 매우 좋다는 것입니다!



그래서 이걸 그래프로 그려보면 위 그래프처럼 나옵니다.

이 모양이 경첩처럼 생겼다고 해서 hinge loss라고 이름이 붙여졌습니다.

그럼 어떻게 되는지 예시로 보면 더 좋겠죠?



결론은 위 파란색 박스와 같은 식이 완성됩니다.

예시를 봐보죠




'고양이'가 정답 클래스입니다. 

먼저 고양이와 자동차를 봐보죠. 근데 이미 볼것도 없이 자동차 score가 5.1로 고양이 3.2보다 높습니다.

이건 그럼 loss가 있겠죠?

그래서 정답이 아닌 클래스(자동차, 5.1) - 정답 클래스(고양이, 3.2) + 1 값을 loss로 줍니다.


근데 고양이랑 개구리를 봐보죠.

일단 고양이가 score가 더 높습니다.

여기서 개구리에 +1을 더해보죠. 그럼 -0.7이 됩니다.

그래도 고양이 score가 더 높죠?

그럼 loss가 0이 되는겁니다.


그럼 2.9 + 0이 되서 = 2.9가 나옵니다.


이 2.9라는 수치는 

이건 2.9만큼 '안좋아!'라는 뜻을 가진 수치입니다.




자동차 기준으로 보죠

자동차는 보나마나입니다.


왜냐하면 자동차가 아닌 클래스(고양이, 개구리) 둘 다 + 1을 해도 car score를 못따라옵니다.

그럼 loss가 다 0이죠.

그래서 0입니다.



똑같이 개구리를 구합니다.

개구리를 구하면 loss가 12.9가 나옵니다.


아까 고양이는 2.9였는데 얘는 12.9입니다.


고양이는 그래도 1개는 맞췄기 때문에 loss가 비교적 낮죠.

즉 개구리를 분류하는 것에 있어서는 얘는 12.9만큼 안좋다는 거니까 고양이보다 훨씬 안좋다는 거죠!




그래서 최종적으로 2.9 + 0 + 12.9를 하고 클래스가 3개니까 3으로 나눠줍니다.

그럼 5.27이 나오죠. 이게 최종 loss입니다!




자 여기서 질문이 있습니다.

만약 자동차 score를 좀 흔들어주면 어케되냐?입니다.

어떻게 될까요??

자동차가 만약 -1이 되어서 3.9가 됐다고 봅시다

그래도 얘는 loss가 0이죠.


왜냐하면 cat에 +1을 해도, frog에 +1을 해도 자동차가 더 높기 때문이죠.


여기서 svm hinge loss의 특성이 나옵니다!

데이터에 민감하지 않다는 것이죠. 둔감합니다.

얘는 score가 '몇 점'인지는 관심 없습니다. 단지, 정답 클래스가 다른 클래스 보다 높냐? 만 관심이 있죠!




2번째 질문. 최소, 최대값을 어떻게 될까요?

아까 hinge loss를 보시면 알겁니다.

loss의 최소값은 0입니다. 0이 제일 좋은거죠.


그리고 최대값은 무한대입니다





3번째 질문.

만약 W가 매우 작아져서 score가 0에 근사해지면 어떻게 되는가?입니다


어떻게 될까요??


계산해보면 되겠죠!



아래 빨간색 박스처럼 될겁니다. 전부 0의 근사치니까 저렇게 되겠죠.

근데 지금은 클래스가 3개니까 2 + 2 + 2 / 3 = 2가 나옵니다.

그럼 10개면 어떻게 될까요? 9 + 9 + 9 ... / 10 = 9가 될겁니다.


즉 이 값은 클래스 개수 -1 값이 나옵니다.

이건 디버그 용으로 많이 사용합니다.

0으로 해주면 loss가 저대로 잘 나오냐?를 검사해보는 것이죠.

이걸 sanity check라고도 부른다고 합니다.




4번째 질문. 

지금까지 우리는 '정답 클래스 값'은 제외 시키고 구했습니다.

왜 제외 시킬까요? 이거에 대한 답이 여기에 나옵니다.

정답 클래스를 속해서 더하면 어떻게 될까요??


구해보면 되죠!



이렇게 됩니다. 즉 평균값이 1이 증가되죠. 지금 우리는 최종 loss가 0이 되길 바랍니다.

왜냐하면 loss가 0이여야 가장 좋다고 보기 편한데 이렇게 하면 1이 가장 좋은 값이 됩니다.

뭔가 이상하잖아요? 그래서 정답 클래스를 빼서 loss가 0이 되도록 하는 겁니다.





5번째 질문. 만약 sum 대신 평균을 이용하면 어떻게 되냐?

정답은 별 상관 없다는 겁니다.

단지 scale만 작아집니다. 평균값으로 했으니까요.

근데 우리는 loss가 작아지는 거에 관심이 있는겁니다. scale이 커지던, 작아지던 상관없죠!




그리고 만약 제곱승을 하게 되면 어떻게 되겠냐? 입니다. 같을까요? 다를까요?


답은 다르다는 겁니다. 일단 제곱을 하면 non linear하다는 겁니다.

그리고 저렇게 해서 구하는 방법을 칭하는 용어가 있습니다.

squared hinge loss라고도 불리우죠.

때에 따라선 저게 잘 먹혀듭니다.


왜냐하면 hinge loss그래프에서 직선이 아니라 곡선으로 제곱승으로 올라가기 때문이죠.

그래서 '매우매우 안좋다' 혹은 '매우매우 좋다'를 따질때 유용할 수도 있습니다.

하지만 일반적으론 제곱승을 하지 않고 그냥 사용합니다.





그래서 이 방법을 numpy로 짜면 이렇게 나옵니다.

소스는 간단하기 때문에 넘어가겠습니다.





근데 문제가 있습니다.

우리가 구하는 W가 과연 unique한 값일까요? 즉, 유일할까요?

아니라는겁니다




간단하게 2배, 3배 이렇게 배의 값을 취하고 해도 똑같이 0이 나옵니다.

즉 W는 여러개가 될 수도 있다는거죠!





이게 왜 문제가 되냐??

자. 우리는 train에 관심이 많나요 test에 관심이 많나요?

우리가 model을 만드는 이유는 새로운 값에 대해서 '예측'을 하고 싶은겁니다.

즉 test set에 더 관심이 많죠. 그래서 test set으로 정확도를 추출하잖아요?


근데 우리가 지금까지 한 것은 train set에 맞추게 했습니다.

즉 W가 train set에 맞춰지겠죠?

근데 test set에도 이 W가 맞춰질까요?

아닙니다.


W는 unique하지 않다고 했습니다.

test에서는 해당 W가 안맞을 수도 있습니다.






우리가 신나게 train에 대해서 위와 같은 모양을 구했다고 보죠

그럼 아래와 같은 상황이면 어떻게 될까요?



저 초록색 값들을 어떻게 예측할까요?

예측하지 못합니다.

한다 한들 정확도가 낮겠죠.

이게 과적합(오버피팅, overfitting)이라고 합니다.

차라리 저 모양보다



이 초록색 모양이 더 낫죠.

즉, test에도 맞을 수 있는 W값을 찾아야 한다는 것입니다!


그래서 여기서 regularization(규제)가 나옵니다.



왼쪽은 data loss고 오른쪽은 regularization입니다.

data loss는 train에 입장에 있습니다. regularization은 test 입장에 있죠.


만약 train이 막 자신한테만 맞는 것을 학습하려고 할때 regularization는 말합니다.

' 너 그렇게 하면 이정도의 패널티는 감안해야해~'


그래서 서로 싸우면서 최적의 W를 찾아나가는 것이죠!




오컴의 면도날이라는 것은 과학계에서 많이 사용하는 말인데요

뭔가 가설을 세우면 단순한게 더 좋다는 것입니다.


그럼 궁금하죠?

저 람다R(W)가 뭐길래 어떻게 규제를 한다는 것일까?

그래서 제 나름대로 알아봤습니다.



이렇게 됩니다.

일단 이 다항식이 깊어지지 않도록 방지하는 것입니다.

특히 머신러닝에서는 이 차수가 깊어지면 깊어질 수록 차원의 저주가 걸리게 되는데요

이 차원이 깊어지지 않도록(다항식이 커지지 않도록) 방지하는 것입니다.

L1은 실제로 차수 값이 0이 되도록하구요,  L2는 전체 차수의 값을 0에 가깝도록 유도 합니다.

일반적으론 L1 regularization보다 L2 regularization을 많이 사용합니다.

왜냐하면 L1은 내가 원하는 특성이 '제거'되기 때문이죠.

하지만 L2는 모든 것을 고려합니다.


그리고 람다값은 규제의 강도값이고

설명은 위를 참고하시면 되겠습니다.





그래서 pt 순서를 조금 바꿔 설명하면

이렇게 데이터가 있으면 L1은 w1을 선호합니다. 왜냐하면 0이 있으니까요

그러나 L2는 w2를 선호합니다. 전체적으로 0에 가깝도록 퍼져있으니까요!


이걸 수학적으로 보면...




이렇다고 합니다.

전 잘 모르겠습니다.. ㅠㅠ

수학적으로 어떻게 되는지 정말 궁금한데 참..ㅠ 


아무튼 L1 regularization과 L2 regularization의 내용은 이렇습니다.

굳이 이렇게 깊게 안들어가도 됩니다. 강의에서도 이렇게 깊게 들어가지 않습니다.

단지 제가 궁금하고, 공부한 것을 정리한 것일 뿐입니다.





그래서 일반적으로 L2 regularization을 많이 사용하고

dropout, batch normalization등도 많이 사용합니다.

이것들은 추후 강의에서 나옵니다



자 여기까지가 svm의 hinge loss였습니다.

그리고 많이 사용하는 loss가 또 있습니다.

바로 softmax classifier인데요(소프트맥스 라고 많이 부르죠)

이거는 cross entropy(크로스 엔트로피)라고도 불리웁니다.



이렇게 있다고 가정하면




softmax function은 위와 같습니다.

모든 스코어를 exp를 취하고 그걸 다 더한 다음에 원하는 클래스의 점수를 exp 취해서 나눕니다.

그러면 '확률'값이 되겠죠?

예를 들어 1 / 1 + 2 를 하면 1의 확률은 1/3이 됩니다. 이런것이죠

exp를 취하는 이유는 조금 있다가 설명나옵니다



그리고 내가 원하는 정답 클래스에 -log를 취해줘서 loss를 구하게 됩니다



이렇게 말이죠

근데 왜 -log를 취할까요?

exp는 왜하죠??


궁금하시죠

그래서 또 제 나름대로 알아봤습니다 ㅎㅎ





아마 홍콩과기대 김성훈(sung kim)교수님의 모두의 딥러닝 강의를 보신 분들은 아실 내용일겁니다.

softmax는 multinomial logistic regression입니다.'

로지스틱 회귀는 시그모이드 함수라고도 불리우죠

시그모이드 함수는 위 사진 왼쪽 그래프입니다.

exp값이 취해져있죠! 그래서 exp를 사용합니다.


그리고 -log를 취하는 이유는 오른쪽 사진과 같습니다.

우리는 '얼마나 안좋은지'를 판단하는 것이죠

x축이 확률, y축이 loss라고 생각하시면

-log를 보면 확률이 1에 가까워질수록(x축, 우리가 원하는 클래스의 정답률이 1에 가까우면 100%라는 것이니 좋은것이죠)

loss가 0에 가까워집니다(y축)


그래서 -log를 사용합니다.


이것도 예시를 봐보죠!





아까 보았던 예시에서 계산을 해보죠



exp를 취하면 위와 같은 값이 나옵니다.



그리고 전체를 더한 값. 즉 188.68을 각각 나눠줍니다.

그러면 24.5는 24.5 / 188.68 이니 0.13 등이 나오게 됩니다

이게 확률값이 되고

마지막으로




내가 원하는 정답 클래스에 -log값을 취해줍니다.

즉 얘는 0.89만큼 구지다는 것을 나타내죠



여기서도 질문이 나옵니다.

min, max값은 무엇일까요?

최소는 이론적으로 0입니다. 최대는 이론적으로 무한대이죠.

-log 그래프를 보시면 아실겁니다.






그리고 아까 질문과 같이 만약 스코어가 0으로 가까워지면 어떻게 될까요?

아까 hinge loss에서는 클래스 개수 -1 ( C-1 )값이었습니다.



여기서도 계산해보면 이렇게 됩니다.

즉 -log(1/클래스개수)가 되죠

얘도 마찬가지로 디버그 용도로 사용하고 sanity check라고도 불리웁니다.




이렇게 score가 나오면 svm hinge loss와 cross-entropy loss(softmax)의 차이점을 볼 수 있습니다.

max값을 취해서 구하는 것과 exp를 취해서 확률 값으로 만드는 것이냐의 차이를 볼 수 있죠




이 둘의 차이점은 이게 끝이 아닙니다.

여기서 질문은 만약 datapoint를 흔들어 주면 어떻게 될까?입니다.

앞서 SVM에서 car 점수를 조금 변경시켰을때 어땠나요?

그냥 hinge loss는 '정답 클래스'가 '정답이 아닌 클래스 + 1'보다 크면 끝이었죠.

즉, 정답 클래스 점수가 정답이 아닌 클래스 점수보다 높으면 끝이었습니다.

그래서 점수 포인트가 바뀌어도 딱히 영향이 없습니다.

즉 '둔감'하죠


하지만 cross-entropy loss(softmax function)은 다릅니다.

얘는 확률로 계산되기 때문에 조금만 데이터가 변경되도 바로 확률에 영향을 미칩니다

그래서 매우 '민감'하죠!


이게 이 둘의 큰 차이점입니다.




요약하자면 이렇게 됩니다.

full loss는 언제나 regularization을 추가한 것이죠!




자! 이제 '이 W가 안좋아!'라는 것을 알게되었습니다.

그럼 어떻게 해야 하죠?

'좋은' 값을 찾아나서야죠!


그게 바로 아래





optimization입니다.




optimization은 산속에서 골짜기를 내려가는 것과 같습니다.

좋은 위치로 내려가는 것이죠

즉 loss가 0인 지점을 찾아나서는 것입니다.





그 방법중 하나가 random search입니다. 절대 사용하지 말아야합니다.

이런 방법이 있다~ 라는 것입니다.

이거는 말 그래도 랜덤하게 포인트를 찾는것이에요

산속 사진을 보면 저~~쪽 산 봉우리나 아니면 바로 앞 지점이나 랜덤하게 w위치값이 걸리는 것입니다.





그래서 안좋으면 15.5% 정확도가 나오고 최고는 95%정확도가 나옵니다.

무려 gap이 80%죠 ㄷㄷㄷㄷ 사용하면 안되겠죠?





그래서 우리는 '경사 하강법'을 사용합니다.

gradient descent라고도 불리우죠

경사를 따라서 조금씩 조금씩 내려가는 겁니다




이게 1차원이면 위와 같은 미분식으로 계산합니다.

만약 다차원이면 편미분된 벡터의 값으로 나오게 됩니다.


이렇게 수식으로 하나하나 계산해서 사용하는 방법이

numerical 방법이라고 합니다. 수치적 방법이죠

아래 예시를 봐볼까요?






W와 loss가 저렇다고 가정을 합시다



맨 처음 값을 h를 0에 가깝게 미세하게 딱 이동시켜봅니다.

근데 loss가 감소했죠?





그리고 경사값을 구하니까 -2.5가 나옵니다.

이제 다음으로 넘어갑니다.





얘는 loss가 증가했네요?



기울기값은 0.6이 나옵니다





그 다음꺼는 loss가 감소하지도 않습니다. 즉 0이 되죠

얘는 loss 변화가 없으니까 볼 필요도 없는 값이죠

이렇게 하나하나 수치적 방법으로 계산하는 것이 위 식이었습니다.


근데 이렇게 해서 언제 계산합니까?

CNN같은 경우 수천만개의 W가 있을 수 있는데

하나하나 계산하면 너~~무 느립니다





우리는 단지 W가 변화할 때 loss를 알고 싶을 뿐!

그렇죠?





그래서 이 2분들이 만들어 놓은 미분식을 이용합니다.

뉴턴과 라이프니츠인데요

이 두분이 만들어 놓으신




미분이라는 마법의 망치를 이용하면 알아서 뚝딱! 하고 나옵니다.

이걸 analytic gradient (해석적 방법)이라고 합니다.


이거에 대한 자세한 설명은 chain rule과 함께 다음장에서 설명될 것입니다.




그래서 이렇게 뚝딱하고 만들어질 것입니다.





요약을 하면 numerical gradient는 정확하지 않고 느리지만 간편하다는 장점이 있습니다.(오류가 덜 나겠죠)

analytic gradient는 정확하고 빠르지만 에러가 많이 나올 가능성이 있습니다.


보통은 analytic gradient를 사용합니다. 하지만 디버깅 및 점검할 때는 numerical gradient를 사용하기도 합니다.

이걸 gradient check라고 합니다






그래서 경사하강법은 이렇게 계산을 합니다.

앞에 -가 붙는 것은 만약 음의 기울기(\모양) 값이면 기울기가 0인 지점(오른쪽 그래프에서 x축이 가장 낮은 지점)으로 가려면 + 방향으로 가야하고

양의 기울기(/ 모양)면 기울기가 0인 지점으로 가려면 - 방향으로 가야하기 때문에 

즉 반대 방향으로 가기에 -를 붙여줍니다.


step size는 흔히 learning rate라고도 불리우는 값입니다.

적절한 값을 찾는게 매우 중요하죠



그래서 임의의 w 위치에서 가운데 빨간색 지점으로 가는 것. 즉 기울기가 0에 가까운 지점으로 가는 것이 우리의 목표입니다.





이건 원래 동영상인데 왼쪽은 저렇게 0인 지점으로 찾아가는 것을 보여주고 있습니다.

오른쪽은 그냥 일반적인 gradient descent 말고 adam, rmsproop 등을 비교해서 보여주는 것입니다.

이것들은 찬찬히 배울 것입니다.




그리고 한 가지 더 알아둬야 할게 우리는 지금까지 N을 한 번에 올려서 계산했습니다.

근데 만약 N이 수천만개 일 수도 있는데 그럼 매우 비효율적이겠죠?

왜냐하면 W가 업데이트 되려면 처음부터 끝까지 계산을 하고 업데이트가 되는데

수천만개를 계산하고 업데이트하고 또 계산하고 업데이트 하면 매우 느립니다.


그래서 stochastic gradient descent(SGD)를 많이 사용합니다.

이거는 minibatch를 두어서 데이터 개수를 잘라서 사용하는 것입니다.

보통 256, 512 처럼 2의 승수로 사용합니다.

그래서 256개를 가지고 W를 업데이트하고 또 다음 256개를 가지고 W를 업데이트 하는 방식으로 갑니다.



이건 데모를 보여주는건데 참고하시면 되겠습니다.


자 이제 막바지입니다!

조금 다른 얘기를 합니다.




이전 까지 이미지는 그냥 말 그대로 있는 그대로 때려박았습니다.

그래서 초기에 말씀드렸다시피 그렇게 성능이 좋지 않았죠. 말머리가 2개 나오는 등의 성능이요.

그래서 CNN이 연구가 많이 되기 전까지 다른 방법을 사용했습니다.

위 사진과 같이 특징을 뽑아내고 이 특징을 합쳐서 linear regression에 던져주는 것이죠





이것에 대한 동기는 위 사진과 같은 상황에서 받았습니다.

왼쪽은 linear한 직선으로 구분을 하지 못하죠. 아무리 해도 직선으로 구분할 수 없습니다.

하지만 얘를 극좌표계로 바꾸니까 linear하게 구분할 수 있게된 것이죠

이미지에서 이렇게 하진 않지만 여기서 동기부여를 받았습니다.




그렇게 특징을 추출하는 방법중 하나가 바로 color histogram입니다. 컬러 hue값이 있는데 여기에 어떤 컬러가

많이 나오는지 count를 세서 특징을 추출하는 것이죠.





2번째는 HoG(Histogram of Oriented Gradients)입니다.

이것은 방향값을 히스토그램으로 표현하는 것이죠




그래서 이미지를 8x8로 자르고 해당 값에 어떤 각도가 많은지 히스토그램으로 나타내어 특징을 추출합니다.





그리고 3번째로 bag of words 방법입니다.

이 방법은 제가 관심있어하는 자연어 처리에서 많이 사용하는 방법인데요


먼저 이미지를 막 잘라냅니다.

그리고 이걸 비지도 학습과 같이 클러스터나 이런걸로 돌려버립니다.

그러면 각도, 색깔 등의 추출이 알고리즘으로 인해 뽑아질 것입니다.

이제 새로운 이미지가 들어오면 이 이미지를 잘라내서 클러스터와 비교해 어떤 특징이 있는지 비교합니다.

이렇게 하는 방법이 오래된 방법이 아니고

불과 5~10년된 방법이라고 합니다.

심지어 bag of words는 이 강의를 맡고 계신 fei-fei li 교수님이 대학원 시절에 만드셨다고 하네요





하지만 지금은 그렇지 않습니다.

특징을 뽑아내서 사용하는 것이 아니라 입력된 이미지에서 스스로 특징을 뽑아내도록 사용하고 있죠

이게 CNN입니다.



다음시간에는 neural network와 backpropagation(오차역전파)를 알아봅니다.


수고하셨습니다.


728x90
반응형
4 Comments
댓글쓰기 폼