과학

딥러닝 시리즈 ) 왜 확률을 쓸까?

딥러닝을 조금만 공부하다보면 '소프트맥스 활성화' 란 부분을 맞닥뜨릴 수 있어.

가중치니 뭐니 다 연산하고 처리한다는건 알겠는데, 그걸 '활성화' 시켜서 '확률'로 만드는 게 딥러닝의 핵심이라고 볼 수 있어.

가령 예를 들어 어떤 이미지인지 분류하는 딥러닝 모델이 있다고 하자.

 

Simple Image classification using deep learning — deep learning series 2 |  by Dhanoop Karunakaran | Intro to Artificial Intelligence | Medium

( https://medium.com/intro-to-artificial-intelligence/simple-image-classification-using-deep-learning-deep-learning-series-2-5e5b89e97926 )

이 때 딥러닝 모델은 이미지가 '차'일 '확률'을 출력하게 돼.

그런데 여기에 의문을 가진적 없어?

딥러닝이란것도 결국 코드로 이뤄진 프로그램이잖아?

개발자들은 if else 기법으로 처리하는게 기본이었는데, 딥러닝에선 왜 갑자기 확률로 처리할까?

(아마 대부분의 개붕이들은 교양으로라도 파이썬을 접해서 if elif else 이런건 다 알거야 그치?)

 

이건 두 가지 근거로 정리할 수 있어.

1. 현실 세계의 데이터는 오류가 날 확률이 있다.

2. 확률을 사용하면 오류를 잘 계산할 수 있다.

이게 무슨 소리일까? 한번 자세히 설명해볼게.

 

1. 현실 세계의 데이터는 오류가 날 확률이 있다.

 

딥러닝은 머신러닝의 하위 범주에 속해.

머신러닝이란 무엇이냐? 패턴을 직접 짜는게 아닌 데이터로부터 패턴을 학습하는 방법이야.

기존의 프로그램이라고 불린 것들은 (이른바 Rule-based) 내가 직접 코드를 짜서 알고리즘을 정해주는 방식이었어.

어떻게 생각할지를 직접 일일이 알려주는거지. 마치 수학 수업에서 학생들에게 선생님이 계산 방법을 알려주는 거라고 생각하면 돼.

그런데 머신러닝은 그게 아니라 수학 문제와 정답만 알려줘. 그러면 모델이 알아서 계산 방법을 익히게끔 하는거야.

 

이 방법은 정말 좋은 아이디어였어. 이제 수많은 개발자들이 피똥싸면서 디버깅을 하지 않아도 되고

현실에 있는 데이터를 쏟아붓기만 하면 되거든!

근데 문제가 하나 있어. 현실의 데이터는 오류가 날 확률이 있단거야.

 

A Survey of Image Classification With Deep Learning in the Presence of Noisy  Labels | by Monica Dommaraju | The Startup | Medium

( https://medium.com/swlh/a-survey-of-image-classification-with-deep-learning-in-the-presence-of-noisy-labels-570d9a44dd40 )

현실에서 데이터를 수집하기 위해서는, 예를 들어 사진 데이터를 수집한다고 하자.

그러면 단순히 사진만 찍을 게 아니라 어떤 개체인지 사람이 직접 지정을 해줘야 해.

그래야 모델이 이 사진이 어떤 개체인지 학습할 수 있잖아? (위에서 수학문제와 정답을 알려줘야 한다고 했던걸 기억해)

그런데 사람이 여기서 실수를 하지 않으리란 보장이 있어? 아니지. 데이터는 언제든지 잘못될 수 있어.

 

그뿐만이 아냐. 이미지가 아닌 텍스트 데이터라고 해보자.

누군가 "radom" 이란 단어를 쳤다고 하자. 이건 어떤 단어의 오타일까?

대부분은 아마 random의 오타라고 생각할거야. 근데 라돈(radon)이란 단어도 있거든?

심지어는 폴란드에 radom이라는 도시도 있어. 그럼 radom이란 단어는 폴란드의 radom이라는 도시를 뜻하는걸까?

아니면 random, radon의 오타인걸까? radom이 절대적으로 맞다고? 그 지방 소도시가 그렇게 많이 거론된다는거야?

 

이렇게 아무리 정신 멀쩡하게 데이터를 수집해도 항상 오류가 존재할 '가능성'이 존재해.

근데 이걸 if else로 짤 수는 없어. if else 방법은 분기를 설정하는 방법이지 가능성을 고려하는 것이 아니기 때문이야.

그렇기 때문에 이걸 표현하려면 확률을 사용할 수밖에 없는거야.

확률을 사용한다면 이 골치아픈 문제를 정말 간단하게 표현할 수 있어.

예를 들어 내가 임의로 확률을 정한다 치면

 

P("radom") = {"random의 오타" = 50% , "radon의 오타" = 25% , "radom" = 25% }

 

와 같이, "radom"이 어떤 단어에 해당할지 가능성을 정해줄 수 있지.

마치 슈뢰딩거의 고양이와 비슷하지 않아? 어떤 단어에 해당할지에 대한 가능성이 중첩되는 상황이잖아.

 

2. 확률을 사용하면 오류를 잘 계산할 수 있다.

 

이제 확률을 사용하게 되면 놀라운 일이 벌어지게 돼.

바로 가상의 확률을 가정할 수 있게 된다는 거야.

머신러닝은 실세계로부터 데이터를 일부(표본) 떼와서 학습하는 방법이야.

때문에 실세계에서 데이터가 어떨지, 데이터의 확률이 어떨지는 확언할 수 없어.

 

예를 들어볼까? 내가 위에서 만들었던 예시

 

P("radom") = {"random의 오타" = 50% , "radon의 오타" = 25% , "radom" = 25% }

 

가 진짜는 아닐거아냐? radom이란 단어가 쓰였을 때 random일 확률이 정말 50%일리 없지.

그럼 "실세계의 확률"을 구하기 위해서는 어떻게 해야할까.

확률을 계산하는 공식은 우리 모두 알고 있잖아? (특정 사건이 발생하는 경우의 수 ) / (모든 사건이 발생하는 경우의 수)

그럼 실세계의 확률을 구하기 위해서는 radom이 실제로 어떤 단어에 해당하는지, 오타였는지 아닌지

과거부터 현재까지 모든 경우를 다 따지고 조사해서, 인터넷상 뿐만이 아니라 편지에 쓰인 글씨까지 싹 다 조사해서 검토해야겠지.

이게 말이 돼? ㅋㅋㅋㅋ 이걸 무슨 수로 구해?

그렇기 때문에 항상 실세계의 확률은 구할 수 없어. 안타깝지만 모델이 실세계의 확률을 정확하게 그대로 복사 붙여넣기해서 출력하는 건 불가능해.

 

그럼 뭐야. 결국 분류작업같이 데이터를 분석하는것도 애매~모호한 확률로 출력되고

그거조차 실세계의 확률을 출력하는것도 불가능하다고?

딥러닝이 이렇게 별거 아니었어?

아냐. 실세계의 확률을 복붙은 못해도 모방할수는 있어.

 

내가 아까 말했지? 머신러닝은 실세계로부터 데이터를 일부 떼와서 학습하는 방법이라고.

그렇다면 우리는 radom, random, radon이 쓰인 데이터를 일부 떼와서 딥러닝 모델에 학습시킬 수 있겠지.

이 때 P에 유사한 P~ 를 학습한다고 해보자.

(이 때 P는 실세계의 확률모델이고, P~는 딥러닝 모델의 확률모델이야. P에 radom을 넣으면 random의 오타인지, radon의 오타인지, radom인지 정확한 확률을 출력해줘, 위에서 언급했듯 현실에서 구현할 수 없는 모델이야. P~는 우리가 P와 최대한 유사하게 만들려는 딥러닝 확률모델이야.)

P~의 입력으로 "It's radom variable" 이란 문장을 넣어주고, 이 때  "radom"이 어떤 단어에 해당하는지 확률을 구한다고 하자.

그러면 P~( "radom" |  "It's radom variable" ) = { ? } 로 표현할 수 있어. ( 저 작대기는 신경쓰지마. 그냥 내가 저렇게 표현한거 뿐이야)

 

그나저나 저 문제는 딱 보면 알겠지? 문장을 해석해보면 랜덤변수야~ 라는 뜻일거잖아? 그럼 radom은 random에 해당하겠지.

물론, 오타일 수도 있어. radon을 쓰려고 했는데 radom으로 오타가 난 걸수도 있지. 하지만 이건 아주 작은 확률이라 무시해도 될거야.

자. 그럼 Q라는 확률모델을 만들어서 이렇게 표현해보자.

 

Q( "radom" |  "It's radom variable" ) = { "random = 100%, "radom" = 0%, "radon" = 0% }

 

이 때 Q는 내가 임의로 만든 확률모델이야. 이 모델은 "radom" |  "It's radom variable"을 입력받았을 때 이렇게 아주 단순하게 출력해.

바로 내가 '이럴 때는 당연히 random이지!' 라고 생각해서 random에 100%를 때려박아서 만든 데이터야.

이렇게 해서 수학문제와 정답을 만들었어.

왜 P~를 이렇게 직접 안 만들었냐고? P~는 P와 아주 비슷하게 만들거거든. 그리고 P~는 Q라는 정답지를 이용해서 학습할거야.

바로 KL 다이버전스라는 장치가 있는데, 이 장치를 사용하면 P~는 Q를 모방하게 되지만, Q와 동일해지지는 않아.

Q를 이용해서 P~가 P를 모방하게끔 하는거지.

왜 이렇게 복잡하게 생각하냐고?

 

우선 P~는 random = 100% 이라고 안 할거야. 아마도 P는 random=99%라고 출력할테니, P~도 99%라고 출력하게 만들어야지.

그럼 P~가 random = 99%로 출력하게 하도록 직접 random = 99%라고 확률값을 정해서 학습시켜주면 안되냐고?

그럼 내가 말한 머신러닝에서 수학문제와 정답을 만드는 작업이 아주 골치아파지게 되거든.

어떤 경우에 random=99%라고 말할 수 있을까? 어떨때는 95%겠지? 또 어떨때는 50%? 사람에 따라서 그 기준이 달라지나?

 

아냐. 다 하지마. 그냥 Q를 만들듯 단순하게 만들어버려. 무조건 한쪽에 100%로 몰아버려. 그러면 데이터를 만들기 아주 쉬워지잖아.

P와 크게 달라질 경우 ( 사실 P(~) = {random = 50%, ... } 였을때) 는 어떻게 하냐고?

거꾸로 생각해보자. 이 때는 사실은 유사 데이터가 얼마 없거나 사람이 Q를 만들기 어려운 상황이야.

그 말은 Q도 잘못 만들어질 가능성이 있다는 것이지.

Q가 잘못 만들어진다는 말은 뭘까?

 

Q( "radom" |  어떤 문장 ) = { random = 100%, radom = 0%, radon = 0% }

Q( "radom" |  어떤 문장 ) = { random = 0%, radom = 100%, radon = 0% }

Q( "radom" |  어떤 문장 ) = { random = 0%, radom = 0%, radon = 100% }

 

이 세 종류의 데이터를 같이 학습해버릴 가능성이 있다는거고, 이렇게 학습된 P~는

 

P~( "radom" |  어떤 문장 ) = { random = 33%, radom = 33%, radon = 33% }

 

가 될거야.

어라? 자연스럽게 ( 사실 P( "radom" |  어떤 문장 ) = {random = 50%, ... } 였을때) 와 가까워졌네???

아주 요상스런 조화로 인해 우리의 딥러닝 모델 P~는 P와 근사하게 되었어.

 

더 신기한건

데이터가 충분하고 KL 다이버전스 장치가 잘 돌아간다면 실세계의 확률모델 P을 잘 모방하는 P~를 아주 높은 확률로 만들 수 있어.

저 잘나신 세계의 척척박사님들이 수학으로 다 증명해놨어.

이렇게 확률을 사용하게 되면 데이터를 만드는 작업도 편해지고, if else를 사용하지 않아도 되고

불확정성을 사용할 수 있게 되고, 그로 인해 도리어 실세계에서 벌어지는 일을 잘 계산할 수 있게 돼.

 

자세한 내용이 궁금하다면 속편을 써볼게. 속편에서는 KL 다이버전스가 뭔지, 학습이 실제로 어떻게 돌아가는지 써볼게.

55개의 댓글

딥러닝하려면 석사는 해야 해?

0
2022.04.20
@고위식물학자텔아른

그런듯 공부 양 자체가 좀 있어서

0
2022.04.22

잼있다. 고마워 추천박음

0
2022.04.26

얼추 배운건데도 다시 보니까 또 새로운 얘기같네

나는 공부하면 안되나보다

0
2022.04.26
@맛있는고구마

정석은 너가 배운게 맞을걸? 통계쪽이랑 컴퓨터쪽 접근방법 묘하게 섞어서 쓴거라

0
무분별한 사용은 차단될 수 있습니다.
번호 제목 글쓴이 추천 수 날짜
563 [과학] 경계선 지능이 700만 있다는 기사들에 대해 34 LinkedList 12 18 일 전
562 [과학] 번역)새들은 왜 알을 많이 낳는가? - 후투티의 형제살해 습성... 7 리보솜 3 2024.03.23
561 [과학] 학계와 AI, 그리고 Bitter Lesson (쓰라린 교훈) 26 elomn 35 2024.02.17
560 [과학] 지구의 속삭임, 골든 레코드의 우주 9 Archaea 10 2024.02.16
559 [과학] 잔혹한 과학실험 이야기 <1> 절망의 구덩이 19 개드립하면안됨 37 2024.02.15
558 [과학] 스트레스를 받으면 술이 땡기는 이유 12 동식 16 2024.02.10
557 [과학] 지능은 모계유전이 아니다. 40 울릉특별자치도 35 2024.01.26
556 [과학] 진화를 생각할 때 고려할 것들 23 날씨가나쁘잖아 12 2024.01.17
555 [과학] 학문적(과학적) 접근과 유사 진화심리"학" 26 날씨가나쁘잖아 19 2024.01.15
554 [과학] 호모 사피엔스의 야릇한 은폐된 배란에 대한 남녀 학자의 다... 14 개드립하면안됨 15 2023.12.29
553 [과학] 김영하의 작별인사를 읽고 느낀 점 (스포있음) 21 장문주의 2 2023.11.28
552 [과학] 제4회 포스텍 SF 어워드 공모전 ( SF 단편소설 / SF 미니픽션 ) 2 따스땅 1 2023.11.25
551 [과학] 펌) CRISPR 유전자 가위 치료제 "최초" 승인 12 리보솜 7 2023.11.25
550 [과학] 러시아는 기술산업을 어떻게 파괴시켰는가(펌) 9 세기노비는역사비... 15 2023.11.18
549 [과학] 고양이에 의한 섬생태계 교란과 생물 종의 절멸 (펌) 2 힘들힘들고 6 2023.11.16
548 [과학] 번역) 알츠하이머병 유전자는 어떻게 살아남았는가? 12 리보솜 10 2023.11.15
547 [과학] 『우영우』의 자폐 스펙트럼 장애 개념이 왜곡인 이유 (펌) 47 힘들힘들고 10 2023.11.12
546 [과학] 흑수저 문과충 출신 구글 취직하는 파이썬 특강 -1 14 지방흡입기 11 2023.09.27
545 [과학] 국가별 당뇨 유병율 이거 뭐가 바뀐건지 아는사람? 8 LAMBDA 1 2023.09.27
544 [과학] 물샤워 ㅇㅈㄹ 하는 놈들 봐라 171 철동이 48 2023.09.23