데보션앱 소개페이지 바로가기
로그인 선택

신고하기

CLOSE
신고사유 (대표 사유 1개)
상세내용 (선택)
0/200
  • 신고한 게시글은 더 이상 보이지 않습니다.
  • 이용약관과 운영정책에 따라 신고사유에 해당하는지 검토 후 조치됩니다.
  • 허위 신고인 경우, 신고자의 서비스 이용이 제한될 수 있으니 유의하시어 신중하게 신고해 주세요.
(이 회원이 작성한 모든 댓글과 커뮤니티 게시물이 보이지 않고, 알림도 오지 않습니다.)

미리보기

커뮤니티

      1,234

      badge 23.06.15

      글 등록

      카테고리를 선택해주세요.

      DEVOTEE를 활성화 시키면
      지금 작성한 커뮤니티 글에 대해 1개의 댓글을 달아줍니다.

      버튼을 누르면 글 수정 시 ChatGPT가 작성한 댓글이 수정됩니다.

      임시저장함에 저장되었습니다. 저장일시 : 2022.5.17 14:29:08

      임시저장함

      제목을 선택하시면 이어서 작성이 가능하며,
      최대 20건까지 저장합니다.
      컨텐츠 유형, 제목, 저장일시, 삭제로 이뤄진 임시저장 목록
      컨텐츠 유형 제목 저장일 삭제

      데보션 블로그 게재 요청

      CLOSE
      • *
      • *

      본인인증

      효율적인 데보션 서비스 이용 및
      고객님의 소중한 개인정보보호를 위해
      본인인증을 진행해주세요. 본인인증 미 진행 시 로그인이 제한됩니다.
      본인인증 실패

      본인인증 로그인에 실패하였습니다.
      회원이 아니시거나 본인인증 등록이
      완료되지 않은 사용자입니다.

      회원정보 연결

      [데보션영과 함께하는 책읽기-5편] 메타버스&프로그래머의 뇌, 밑바닥부터 시작하는 딥러닝

      clyde17 23.01.09
      1,586 20 1

      여는 이야기

      DEVOCEAN YOUNG에서 몇 달 동안 '다독다독' 프로젝트를 진행했는데요, 좋은 기회를 통해 평소 읽어 보고 싶었던 책을 읽고 공유까지 할 수 있게 되어 좋았습니다.

      저희 조는 각자 관심 분야가 달라 따로 독서한 후 의견을 나누는 식으로 스터디를 진행했습니다. 이 글 하나만 읽으시면 세 권의 내용과 저희의 생각을 알아가실 수 있습니다!

      그럼, DEVOCEAN YOUNG 1기 아무것도모르조의 메타버스, 프로그래머의 뇌, 밑바닥부터 시작하는 딥러닝 3권의 책 리뷰에 들어갑니다.


      1. 메타버스 - 디지털 지구, 뜨는 것들의 세상 (이예슬 정리)


      메타버스(METAVERSE)란 초월, 가상을 뜻하는 ‘META’와 세상, 우주를 뜻하는 ‘UNIVERSE’의 합성어로, ‘현실을 초월한 가상의 세계’를 의미합니다.

      여기에서 그치지 않고 더 나아가 다양한 영역에서 ‘현실과 비현실이 공존하는 가상의 세계’를 의미하기도 합니다.

      동시대를 살고 있다면 ‘메타버스’라는 단어를 처음 듣는 사람은 없을 것입니다.

      코로나19로 인한 언택트 시대가 도래하며 미디어, 산업, 일상 등에서 메타버스 세계가 열렸기 때문입니다.

      혹여 메타버스라는 단어가 낯설도 와닿지 않더라도 일상에서 이미 경험하고 있었으리라 장담합니다.

      인스타그램, 게더타운, 디스코드, 온라인 게임 등등 대부분의 영역에서 메타버스가 확장되었기 때문입니다.

      메타버스의 의미는 시대와 기술의 발전에 따라 고정되어 있지 않고 끝없이 변동한다는 점을 간과해서는 안 됩니다.

      그렇기에 우리는 메타버스가 무엇인지 알고 격변하는 시대에 맞추어 살기 위해 대비를 할 필요가 있습니다.


      이 책에서는 메타버스를 증강현실, 라이프로깅, 거울 세계, 가상 세계의 4가지로 분류하고, 낯설지 않게 예시를 들어 주며 설명합니다.

      증강현실(AR)에서는 ‘포켓몬고’의 대유행과 국내 드라마 ‘알함브라 궁전의 추억’을 예시로 들었습니다.

      증강현실이 주목받는 이유는 증강현실이 현실에 판타지와 편의를 입힘으로써 정보를 효율적으로 전달함과 동시에 특정 상황에서 우리에게 강한 실재감을 전해 주기 때문이라고 합니다.

      현실보다 더 현실 같은 증강현실 메타버스에서 삶이 어떻게 바뀔지 생각이 필요합니다.

      라이프로깅은 ‘내 삶을 디지털 공간에 복제하는 것’을 의미하는데, SNS라고 생각하면 될 것 같습니다.

      이 세계에서는 자아가 여러 개가 될 수도 있고(멀티 페르소나), 다양한 면을 접하며 공감이나 대리 만족도 얻을 수 있다.

      자아 표출을 원하는 인간의 심리적 욕구가 라이프로깅 세계에서 해소되는 것입니다.

      그러나 인간은 만족할 수 없는 동물이기에 앞으로 어떤 식으로 라이프로깅이 강화될지 대비할 필요가 있습니다.

      거울 세계에서는 ‘카카오 유니버스’를 예시로 들었습니다. 대한민국에서는 카카오가 서비스하지 않는 것을 찾아보기가 더 힘듭니다.

      소셜미디어, 지도, 금융, 교통, 쇼핑 등등 디지털 공간에서 이루어지는 거의 모든 것을 할 수 있으니 말입니다.

      거울 세계는 공간의 제약이 없기에 현실 세계보다 효율적이고, 앞으로도 더확장될 것입니다.

      가상 세계는 ‘현존하지 않는 세계’로, 게임을 예시로 들었습니다.

      그러나 게임이 아닌 곳에서도 가상 세계는 다양하게 활용되고 있습니다.

      바이든이 ‘모여봐요 동물의 숲’ 게임 내에 꿈번지를 생성하여 선거 캠페인을 진행하거나, 콘서트를 온라인으로 하는 등의 사례가 있습니다.

      책에서는 사람들이 현실에서의 기쁨이 부족하여 갈증을 느껴 가상 세계에서 찾으려고 한다고 합니다.

      어느 정도 갈증 해소에 도움이 되겠지만, 적당히 몰입할 필요도 있습니다.


      책을 선정했을 때는 메타버스의 구조나 원리에 대해서 알아보려는 마음이 컸지만, 기대와는 다르게 가벼운 입문서 같은 느낌이었습니다.

      그러나 다양한 예시로 메타버스를 설명해 주어서 개념 정리와 활용 사례를 알아보기에 유용했습니다.

      메타버스의 문제점을 생각해 본 적이 딱히 없었는데 부작용이 당연히 존재한다는 것을 깨달았고, 항상 발전의 이면에는 경계가 필요하다는 것 또한 상기시켰습니다.

      현실을 넘어선 세계에 존재해야 되는 만큼, 도태되지 않기 위한 공부를 시작할 사람들에게 추천합니다!


      2. 프로그래머의 뇌 : 훌륭한 프로그래머가 알아야 할 인지과학의 모든 것 (김채현 정리)


      혹시… “나는 머리가 나쁘거나 코딩에 소질이 없는 것 같아. 나만 이걸 모르네..."

      이런 생각 해보신 적 있으신가요? 저는 항상 그러합니다.


      또 혹시… 코드 작성 연습 VS 코드 읽기 연습

      이 둘 중 어느 것에 더 많은 시간과 공을 들이고 계신가요?

      …

      🤷 “네가 머리가 나쁘거나 소질이 없어서 모르는 게 아니고, 헷갈리고 혼란스러운 건 당연한거야. 왜냐하면 우리 뇌가 이러이러하게 작동하기 때문이지!”

      이런 말을 건네는 책 한권이 있습니다. 불필요한 자책과 좌절 대신, 코딩 공부를 계속할 수 있게 긍정적인 사고와 구체적인 방법까지 제시하는 이 책이 궁금하지 않으신가요?


      안녕하세요. 저는 데보션영 1기 아무것도모르조의 김채현입니다.

      다독다독 미션을 위해, 프로그래밍과 관련된 흥미로운 내용을 다루는 책을 찾다 이 책을 읽게 되었습니다.

      바로 “프로그래머의 뇌 : 훌륭한 프로그래머가 알아야 할 인지과학의 모든 것(2022)”이라는 책입니다.


      들어가기에 앞서, 지금까지 여러분의 코딩 인생(^^)을 되돌아봐주세요. 코드를 작성했던 경험과 시간이 더 많으신가요, 아니면 코드를 읽은 경험과 시간이 더 많으신가요?

      프로그래머가 일하는 시간 중 코드를 읽고 분석하는 일이 작성하는 일보다 생각보다 많습니다.

      아니 오히려 더 많습니다. 프로그래머는 시간 중 거의 60%를 ‘작성’하는게 아니라 코드를 읽고 ‘이해’하는데 사용하고 있으니까요.

      코드를 읽는 것, 분석하고 이해하는 것이 생각했던 것보다 훨씬 더 중요한 것 같습니다.

      이는 또한 정확도를 유지하면서 코드를 빨리 이해할 수 있게 될 경우, 프로그래밍 기술이 크게 개선되는 셈이기도 합니다.


      image.png

      2017년의 한 연구 (X. Xia, L. Bao, D. Lo, Z. Xing, A. E. Hassan and S. Li, "Measuring Program Comprehension: A Large-Scale Field Study with Professionals," in IEEE Transactions on Software Engineering, vol. 44, no. 10, pp. 951-976, 1 Oct. 2018, doi: 10.1109/TSE.2017.2734091.)


      하지만! 코드를 이해하는 일은 생각보다 더더더 쉽지 않습니다. 아래 두 가지 고민글을 읽어봅시다. 어떠신가요? 저는 심장이 아프고 뼈가 아픈 것 같습니다. ‘그냥 내 얘기잖아!ㅠㅠ’

      image.png


      잡코리아의 한 고민 글. 남의 일이 아니라 함께 착잡한 기분이 듭니다.

      image.png


      네이버 지식인의 한 질문. 제가 쓴 글인줄 알았습니다.


      이 책은 “두뇌가 코드를 처리하는 방식을 인지과학적 측면에서 이해”할 수 있게 합니다.

      프로그래머들은 새로운 정보를 접할 때가 많기 때문에, 새로운 정보가 제시될 때 두뇌가 무엇을 하는지 이해하면 더 나은 프로그래머가 될 수 있다고 설명합니다.

      [1. 코드 더 잘 읽기], [2. 코드에 대해 생각하기], [3. 좋은 코드 작성하기], [4. 코딩에서의 협업]의 총 네 파트로 구성되어 흥미로운 내용들을 다루고 있습니다.


      이 책을 잘 설명하는 문구를 몇 가지 소개드리며, 다독다독 시작합니다 :)

      💡 코드 읽기는 프로그래밍 작업에서 핵심적인 일이지만 전업 개발자라도 코드를 읽는 법을 제대로 모를 수 있다.

      코드 읽는 법을 배울 기회가 없기도 하지만, 연습하지도 않는다.

      코드를 읽는 일은 종종 혼란스럽고 고된 일이다. 코드를 읽는 것이 왜 어려운 일인지 설명하고 코드 파악을 잘하기 위해 무엇이 필요한지 이해할 수 있도록 돕고자 한다. (1장 중)


      💡 프로그래밍을 처음 배울 때는 코드를 만들어내는 것에 관심을 많이 갖는다.

      일단 프로그래밍을 배우고 나면 코드를 작성하는 것에 훨씬 더 많은 관심과 시간을 쏟는다.

      문제를 어떻게 풀고 그것을 코드로 어떻게 구현하는지를 집중적으로 훈련한다.

      코드를 읽는 연습은 거의 전무할 것이다.

      이 장을 통해 코드를 읽는 기술을 향상하길 바란다. (2장 중)


      코딩 중 겪는 혼란에 대한 이해

      익숙하지 않은 코드나 오래 전 직접 작성한 코드를 열어볼 때, 혼란이 발생하신 적 있으신가요?

      저는 그런 경험이 정말 수도없이 많았던 것 같습니다 (일단 저는 현재진행형..).

      어떤 모델 하나를 이해하려다, 여러 라이브러리와 모듈, 패키지의 늪에 빠져 감도 못 잡은 채 이해를 포기하기도 하고, 코드위에 직접 메모를 해가며 코드가 의미하는 바를 거슬러 올라가며 우왕좌왕, 겨우겨우 이해하기도 했습니다.

      image.png

      코드 리뷰 중의 프로그래머들. 허허..

      image.png

      어떠한 코드를 이해해보려 발버둥친 흔적 일부. 포기했습니다.


      1장에서는 다음과 같은 내용을 다루고 있습니다.

      • 코딩 중 혼란이 발생하는 다양한 방식의 차이점 이해

      • 코딩에서 작동하는 세 가지 인지 과정의 비교

      • 세 가지 인지 과정들이 어떻게 서로 보완적으로 작동하는지에 대한 이해


      코딩 중 혼란이 발생하는 다양한 방식의 차이점 이해


      먼저 “코딩 중 혼란이 발생하는 다양한 방식의 차이점 이해” 입니다.

      프로그래밍을 하다 보면, 당연하게도 늘 혼란이 발생합니다. 새로운 언어, 개념, 프레임워크로 겁을 먹을 수도 있습니다.

      익숙하지 않은 남의 코드, 오래전의 나(≠ 현재의 나)라는 누군가가 작성한 코드를 열어볼 때, 이 코드가 어떤 코드인지, 왜 이렇게 코드를 작성했는지 이해되지 않을 수 있습니다.

      누구든지 충분히 그럴 수 있습니다. 하지만, 그것을 필요 이상으로 오래 가져가서는 안 됩니다.

      그러기 위해, 우리는 이 “혼란”을 어떻게 인식하고 해석할지 생각해보아야 합니다.

      세 가지 코드가 있습니다. 모두 숫자 n을 이진수 표현으로 변환하는 코드입니다.

      코드를 읽을 때 어떤 종류의 지식을 사용하고, 그 지식이 서로 어떻게 다른지, 어떠한 혼란이 발생하는지 떠올려보세요.

      (책에서는 예제 코드를 몇 분간 자세히 살펴보기를 권하고 있습니다.)


      2 2 2 2 2 T n

      public class BinaryCalculator {
      	public static void mian(Integer n) {
      		System.out.println(Integer.toBinaryString(n)));
      	}
      }
      LET N2 = ABS(INT(N))
      LET B$ = ""
      FOR N1 = N2 TO 0 STEP 0
      	LET N2 = INT(N1/2)
      	LET B$ = STR$(N1-N2*2) + B$
      	LET N1 = N2
      NEXT N1
      PRINT B$

      떠올려 보셨나요? 발생한 세 가지 종류의 혼란을 코드와 함께 살펴보겠습니다.

      • 지식의 부족

      첫 번째 예제 코드를 보고 혼란스러우셨습니다. 혼란스러우신 이유가 무엇인가요?

      🤷 “`T`가 뭘 의미하는지 몰라서요~”

      해당 코드는 특별히 수학적 계산을 위해 만들어진, 오늘날에는 거의 쓰이지 않는 APL이라는 언어로 작성된 코드입니다. APL을 모르신다면, 당연히 연산자 T의 의미도 모르실겁니다. (저도 모릅니다!)

      코드가 혼란스러운 이유는, T에 대한 지식이 없기 때문이라고 할 수 있습니다.

      • 정보의 부족

      두 번째 예제 코드를 보고, 역시나 혼란스러우셨습니다. 이유가 무엇인가요?

      🤷 “`toBinaryString()` 메서드가 어떻게 작동하는지 몰라서요~”


      두 번째 코드는 자바 코드입니다. 프로그래밍 언어를 어느 정도 알고 계시다면, 이진수 표현으로 변환하는 부분을 찾을 수 있으셨을 겁니다.

      하지만, toBinaryString()이라는 메서드가 내부적으로 어떻게 작동하는지 모른다면, 이 코드에서도 혼란을 느끼게 됩니다.

      프로그램이 어떤 일을 하는지 메서드 이름으로부터 유추할 수도 있겠지만, 이 메서드가 구체적으로 어떤 일을 수행하는지, 정확히 어떻게 동작하는지 이해하려면 메서드의 내부 코드를 따로 살펴보아야 합니다.

      이 코드가 혼란스러운 이유는, 메서드에 대한 정보가 부족하기 때문이라고 할 수 있습니다.

      • 처리 능력의 부족

      세 번째 예제 코드를 보고, 다시 한번 혼란스러우셨습니다. 이번에는 이유가 무엇인가요?

      🤷 “이번 코드는 유추는 되는데, 여러 단계가 실행되는걸 한눈에 파악하기가 좀 혼란스러워요~”


      세 번째 코드는 베이직이라는 언어 코드입니다. 변수 이름이나 연산자를 통해, 코드가 무슨 일을 하는지 유추하셨을 것이라 생각합니다.

      하지만, 코드를 따라가다 보면, 머릿속에서 모든 과정을 처리하기가 쉽지 않습니다. 각각의 단계가 실행되는 것을 한눈에 파악할 수 없기 때문에 혼란스럽습니다.

      변수에 임시로 저장되는 값을 모두 다 기억하거나, 각 경우에 어떤 동작들이 수행되는지를 동시에 알기는 쉽지 않습니다. 혹시 변수들이 중간에 어떤 값을 갖는지 따로 기록하셨나요?

      모든 단계를 이해하고자, 기록의 도움을 받은 것이라 할 수 있겠죠.

      이 코드가 혼란스러운 이유는, 처리 능력이 부족하기 때문이라고 할 수 있습니다.


      세 개 예제 프로그램을 통해 코드가 혼란을 초래하는 원인을 살펴보았습니다.

      1. 프로그래밍 언어나 알고리즘 혹은 업무 영역에 대한 지식이 없는 경우

      2. 코드를 이해하기 위해 필요한 정보를 충분히 가지고 있지 못하는 경우 (요즘 코드가 다양한 라이브러리, 모듈, 패키지를 사용하기에 코드에 대한 정보를 얻기 위해 많이 찾아봐야 하고, 동시에 찾아보는 일을 하기 전 무엇을 하고 있었는지도 기억해야함!)

      3. 코드가 너무 복잡해 혼란이 생기는 경우 : 두뇌의 처리 용량이 부족하기 때문임!

      공감이 되셨나요? 저는 여러 경험이 각 유형마다 떠오르는 것 같습니다.

      직접 경험하신 각 세가지 유형에 해당하는 혼란은 어떤 것인가요?


      코딩에서 작동하는 세 가지 인지 과정의 비교


      다음으로 “코딩에서 작동하는 세 가지 인지 과정의 비교”입니다.

      세 가지 서로 다른 종류의 혼란은 각각 서로 다른 종류의 인지 과정과 연관되고, 이 과정은 기억과 관련 있습니다.

      그리고 이 인지 과정들은 코드를 분석할 때, 작성할 때, 시스템을 설계할 때, 문서를 작성할 때 등 모든 종류의 인지 활동에 나타나게 됩니다.

      • 지식의 부족 = LTM의 문제 (장기 기억 공간, long-term memory)

      “지식이 없다 = LTM에 해당 내용이 없다”

      LTM에 있는 기억은 아주 오랫동안 보관됩니다. 몇 년 전, 혹은 몇십 년 전 일어났지만 기억나는 일, 하나 이상쯤은 있으실 겁니다.

      우리는 어떤 일을 할 때는 LTM을 사용합니다.

      신발 끈을 묶을 때 무엇을 해야할지, 키보드로 코드를 입력하는 동작은 어떻게 하는지, 특정 프로그램을 작성할 때 추상적인 알고리즘과 프로그래밍 언어의 문법을 기억하는 일을 LTM에서 하고 있습니다.

      오랜 시간 저장한다는 점에서 컴퓨터 하드 드라이브와 비슷하다고 비유할 수 있습니다.


      첫 번째 예제 코드였던 APL 예제 코드를 읽을 때, LTM을 가장 많이 사용하게 됩니다. 키워드 T의 의미를 알고있다면 코드를 읽을 때 그것을 LTM으로부터 인출(저장된 정보를 기억해내는 과정)하게 될 테니까요.

      해당 예제를 통해 언어의 문법에 대한 지식도 중요함을 알 수 있습니다. T가 의미하는 바를 알지 못해 코드를 이해하기 어려웠던 것 처럼 말이죠.

      하지만 T가 이항 부호화 함수라는 것을 알면 코드 분석은 매우 간단해집니다. 말로 된 설명을 읽거나, 각 단계별로 동작하는 과정을 이해할 필요가 없습니다.

      • 정보의 부족 = STM의 문제 (단기 기억 공간, short-term memory)

      “지식이 아닌 어떤 정보가 부족하다 = STM에 해당 내용이 없다(정보를 수집할 때 STM에 일시적으로 저장하지만, 다른 정보를 찾는 과정에서 수집한 정보 중 일부는 잊어버림)”

      STM은 들어오는 정보를 잠시 보관하기 위한 공간입니다. 예시로, 어떤 전화번호를 기억하는 경우가 있습니다.

      이 번호는 LTM에 저장되지 않고, 우선 STM에 저장되게 됩니다.

      코드에서 키워드, 변수명, 자료구조 등이 STM에 일시적으로 저장된다고 할 수 있습니다.

      그렇다면 혹시, 한 번에 몇 개의 숫자까지 기억하실 수 있나요? STM에는 크기에 제한이 있고, 기억할 수 있는 항목의 최대치는 12를 넘지 않는다고 알려져 있습니다.


      두 번째 예제 코드인 자바 코드에서, 주로 STM을 통한 인지 과정이 일어났다고 할 수 있습니다.

      (동의하시나요?) 함수의 입력 변수 n이 정수임을 알게 되고, 이를 기억하며 계속 코드를 읽어나가게 됩니다.

      STM은 일정 기간 이 사실을 보관하다, 함수가 하는 일을 이해하고 나면 STM은 그 내용을 기억에서 지우게 됩니다.

      하루, 혹은 심지어 한 시간이 지나기 전 잊어버릴 수 있습니다.


      추가적으로, LTM과 STM에서의 인지 과정이 독립적으로 일어나는지 생각해봅시다.

      과연 그럴까요? 우리 두뇌는 함수명을 미리 가정하고, 이 때 두 인지 과정이 동시에 일어나게 됩니다.

      mian을 읽을 때 이것이 STM에 저장되지만, 이 함수명을 사용하는 대신 main이라고 하는, 과거의 경험으로 인해 이미 LTM에 저장되어 있는 이름을 사용하게 됩니다.

      두 인지 과정이 독립적으로 일어나는 것이 아니라는 것을 알 수 있죠?


      STM은 값을 일시적으로 저장하는 캐시나 메인 메모리에 비유할 수 있습니다.


      • 처리 능력의 부족 = 작업 기억 공간의 문제 (Working memory : 사고 시 이 영역 사용)

      “많은 정보를 처리할 때 작업 기억 공간에 영향을 미친다.”

      STM과 LTM이 기억장치라면, 실제 사고 작용은 작업 기억 공간에서 일어납니다.

      생각, 아이디어, 해결책 같은 것들이 이 곳에서 발생합니다. 두뇌의 프로세서로 비유할 수 있습니다.


      세 번째 베이직 에제 코드에서, LET이나 EXIT 같은 키워드의 의미를 기억해내기 위해 LTM을 사용하셨을 겁니다.

      B$가 빈 문자열로 시작된다는 정보는 STM에 저장하셨을 겁니다.

      그런데, 해당 코드를 읽을 때 그 이상의 일이 발생했습니다. 머리로 무슨 일이 일어날지 이해하려 시도한 것입니다.

      머릿속에서 코드를 컴파일하고 실행하는 과정인, 트레이싱 과정입니다.

      트레이스를 하거나 인지적으로 복잡한 작업 시 사용하는 두뇌가 작업 기억 공간이며, 따라서 컴퓨터에서 계산을 수행하는 프로세서에 비교할 수 있는 것입니다.


      세 가지 인지 과정들이 어떻게 서로 보완적으로 작동하는지에 대한 이해


      마지막으로 “세 가지 인지 과정들이 어떻게 서로 보완적으로 작동하는지에 대한 이해”입니다.

      세 인지 과정들은 서로 밀접하게 연관되어 있습니다.

      사고할 때, 세 가지 인지 과정 모두 어느 정도 활성화되게 되는데, 자바 코드를 읽었을 때에도 경험하셨을 겁니다.

      n이 정수형이라는 정보가 STM에 저장, 정수 그 자체에 대한 정보는 LTM에서 인출, 프로그램이 무엇을 하는지 작업 기억 공간이 파악했습니다.


      정리

      이 책의 가장 첫 번째 챕터를 다루어 보았습니다.

      • 코드를 읽을 때 혼란이 생기는 이유 : 지식 부족, 쉽게 찾을 수 있는 정보의 부족, 두뇌의 처리 능력의 부족

      • 코드를 읽거나 작성할 때 세 가지 인지 과정이 일어남

        • LTM에서 정보를 인출 : 키워드의 의미 등

        • STM에 일시적으로 정보 저장 : 메서드, 변수 이름 등 코드 읽는 과정에서 발생하는 정보

        • 작업 기억 공간 : 코드를 읽고 처리

      • 코드를 읽는 동안 세 가지 인지 과정에 다 같이 일어나며 서로 보완적으로 작용함

      복잡한 알고리즘을 단계적으로 이해하려고 노력할 때 일어나는 혼란과, 어떤 특정 영역에서 사용되는 개념을 잘 이해하지 못해서 일어나는 혼란을 구분하실수 있나요?

      구분하실 수 있다면, 어떤 인지 과정과 관련되어 있는 것인지도 파악할 수 있게 되셨나요?


      코드가 어떻게 다양한 혼란을 초래하고, 각 경우에 인지 과정이 어떻게 다르게 일어나는지 이해하실 수 있게 되셨을 것이라 믿습니다.

      (이 이후의 챕터들에서는 이러한 인지 과정들을 어떻게 개선할 수 있을지 다루고 있습니다.

      이 글의 내용이 공감되거나 흥미로우셨다면, 그리고 인지 과정들을 개선하는 방법이 궁금하시다면 책을 읽어보시길 추천합니다!)


      책의 나머지 내용들도 궁금하시다면, 아래 링크에서 확인하실 수 있습니다. (초보 개발자인 지금의 저에게 공감되면서도 도움된다고 생각한 지점들을 위주로 다루고 있습니다!)

      이 글이 읽어주신 분께 공감 되었거나 도움될만한 내용이었으면 좋겠습니다.


      긴 글 읽어주셔서 감사합니다. ^L^



      3. 밑바닥부터 시작하는 딥러닝 (허혜인 정리)

      image.png

      안녕하세요. DEVOCEAN YOUNG으로 활동하고 있는 허혜인입니다. 데보션영 활동을 을 한지 벌써 5개월이라는 시간이 흘렀는데요.

      데보션 활동 중 읽고싶은 개발관련 도서를 읽고 스터디하는 ‘다독다독’ 활동 내용을 공유하고자 합니다.

      제가 ‘다독다독’ 컨텐츠로 소개해드릴 책은 한빛미디어의 ‘밑바닥부터 시작하는 딥러닝’입니다.

      이 책을 선정한 이유?

      IT업계에 관심을 가지는 누구라면 ‘인공지능’이 오늘날의 Hot한 화젯거리인지 느낄 것이라고 생각하는데요.

      이러한 인공지능의 이면에는 ‘딥러닝’이라는 기술이 중요한 역할을 담당하고 있기에 이번 ‘다독다독’ 활동을 기회삼아 딥러닝 기술을 가볍게 이해하고 관심을 가져보는 시간으로 만들어보고자 이 책을 선정하게 되었습니다.

      딥러닝 활용

      딥러닝은 현재 다양한 분야에서 활용되고 있습니다. 몇가지 딥러닝 활용예시를 소개해보겠니다.

      사물 검출

      사물 검출은 이미지 속에 담긴 사물의 위치와 종류(클래스)를 알아내는 기술입니다.

      https://velog.velcdn.com/images%2Fdyeudsla%2Fpost%2F4fb1d2cc-7ce5-4583-9b1e-4a4b2a75cb35%2Fimage.png

      분할

      분할(segmentation)이란 이미지를 픽셀 수준에서 분류하는 문제로, 픽셀 단위로 객체마다 채색된 지도(supervised)데이터를 사용해 학습하는 기술입니다.

      https://velog.velcdn.com/images%2Fdyeudsla%2Fpost%2Fd18b4dc4-6bec-43ad-896d-050d02ad0e47%2Fimage.png

      딥러닝 연구되고 있는 분야

      이미지생성

      아무런 입력 이미지 없이도 새로운 이미지를 그려내는 연구도 활발히 진행되고 있습니다.

      먼저 대량의 이미지를 사용하여 학습하긴 하지만, 학습이 끝난 후에는 아무런 입력이미지 없이도 새로운 그려냅니다.


      DCGAN(Deep Convolutional Generative Adversarial Network) 기법으로 생성한 침실 이미지

      DCGAN 기술의 핵심은 생성자와 식별자로 불리는 2개의 신경망을 이용하는 것입니다.

      생성자가 이미지 생성하고 식별자로 진짜인지 판정하는 방식으로 계속 학습시키는 방식이 GAN(Generateive Adversarial Network) 기술입니다.

      자율주행

      주위 환경 사물인식을 하여 자율주행을 할 수 있게 딥러닝 기술이 들어갑니다.

      CNN기반 신경망인 SegNet기술이 밑에 그림과 같이 주변 환경을 정확하게 인식하는 모습을 볼 수 있습니다.

      https://velog.velcdn.com/images%2Fdyeudsla%2Fpost%2F5ce40640-4723-44ea-91a0-549d471890aa%2Fimage.png

      딥러닝 기술

      위에서 본 것처럼 딥러닝은 여러 분야에서 활용되고 있습니다.

      이 책에서는 ‘손글씨 숫자 인식’이라는 ‘사물 인식’의 한분야인 이미지 분류 중심으로 사용하는 딥러닝 기술을 ‘퍼셉트론 → 신경망 → 역전파 → CNN’ 순서대로 차근차근 설명해주고 있습니다.

      즉, 딥러닝의 핵심기술인 ‘신경망’을 이해하는데 필요한 지식을 단계별로 직접 구현해보면서 신경망 이론을 쉽게 이해할 수 있도록 해줍니다.

      그럼 간단하게 신경망 기술에 대해 소개해보겠습니다.

      퍼셉트론

      퍼셉트론은 다수의 신호를 입력받아 하나의 신호를 출력합니다. 

      1957년 프랑크 로젠블라트(Frank Rosenblatt)가 고안한 신경망(딥러닝)의 기원이 되는 알고리즘으로, '신호가 흐른다'는 의미를 1로, '신호가 흐르지 않는다'는 의미를 0으로 표시합니다.

      퍼셉트론 동작 원리&수식

      https://blog.kakaocdn.net/dn/dLjFSC/btrr2So0y4v/TGiAeTke4euQfK6KnwlKk1/img.png

      https://blog.kakaocdn.net/dn/bh6jMp/btrsjaay8uF/wWfbf4wYroGBjkAvhaxf6K/img.png

      x1과 x2는 입력 신호, y는 출력 신호, w1과 w2는 가중치, 원은 **뉴런(노드)**을 의미합니다.

      여기서 가중치는 각 신호가 결과에 주는 영향력을 나타내고, 가중치가 클수록 해당 신호가 그만큼 더 중요하다는 의미를 뜻합니다.

      입력 신호가 뉴런에 보내질 때, w1x1과 w2x2 형태로 각각 고유한 가중치가 곱해지고, 뉴런에서 보내온 신호의 총합이 임계값(정해진 한계, θ) 을 넘어설 때만 1을 출력합니다.

      퍼셉트론 구현(AND함수)

      w1, w2, theta = 0.5, 0.5, 0.7
      tmp = x1*w1 + x2*w2
      	return 0
      elif tmp > theta:
      	return 1

      NAND 게이트, OR 게이트도 w1, w2, theta의 값마 다르고 동일한 코드로 구현할 수 있습니다.

      가중치와 편향 도입

      위에서 봤던 퍼셉트론 수식에서 θ를 -b로 치환하여 수식을 다시 정의할 수 있습니다.


      θ를 -b로 치환 후 좌변으로 넘긴 수식

                   θ를 -b로 치환 후 좌변으로 넘긴 수식

      위 수식에서 b를 **편향(bias)**이라고 한다. 편향은 뉴런이 얼마나 쉽게 활성화(결과로 1을 출력)하느냐를 나타냅니다.

      신경망

      위의 퍼셉트론은 가중치를 사람이 직접 설정해야 한다는 단점이 존재합니다.

      이를 해결하기 위해 가중치 매개변수의 적절한 값을 데이터로부터 자동으로 학습하는 신경망(neural network) 이 등장합니다. 여기서는 신경망의 개념과 처리 과정에 대해 정리해보겠습니다.


      위 그림은 2층 신경망을 표현한 그림입니다. 은닉층은 사람의 눈에 보이지 않는 층으로 일명 블랙박스라고 할 수 있습니다. 

      층수는 3층이지만, 가중치를 갖는 층은 2개이므로 '2층 신경망'이라고도 부릅니다.

      위에서 본것처럼 신경망과 퍼셉트론(단층 퍼셉트론)은 비슷해 보이지만 서로 다른 활성화 함수를 사용하고 있다는 점에서 차이가 있습니다.

      활성화 함수

      단층 퍼셉트론은 계단 함수를 활성화 함수로 사용하고 신경망은 시그모이드 함수 등을 사용합니다.

      (1) 계단 함수(step function)


      임계값을 경계로 출력이 바뀌는 함수로, 단층 퍼셉트론은 활성화 함수로 계단 함수를 사용합니다.

      입력 값이 0을 넘으면 1을 출력하고, 넘지 않으면 0을 출력하는 특징을 가지고 있습니다.


      (2) 시그모이드 함수(sigmoid function)


      시그모이드 함수 수식

                   시그모이드 함수 수식

      신경망에서 자주 사용하는 활성화 함수로 0부터 1 사이의 실수 값을 출력하는 함수인 시그모이드 함수입니다.

      계단 함수와 시그모이드 함수 비교

      • 공통점

      1. 입력이 크면 출력이 1에 가까워지거나 1이 되고, 입력이 작으면 0에 가까워지거나 0이 됩니다.

      2. 출력이 0에서 1 사이 값으로 나타납니다.

      3. 비선형 함수입니다.

      • 차이점

      1. 계단 함수는 구부러진 직선 모양이고, 시그모이드 함수는 매끄러운 곡선으로 모양차이가 있습니다.

      2. 계단 함수는 0을 경계로 출력이 급격하게 변하고, 시그모이드 함수는 입력에 따라 출력이 연속적으로 변합니다.

      3. 계단 함수는 0과 1 중 하나의 값을 출력하고, 시그모이드 함수는 0과 1 사이 실수를 출력합니다.


      비선형 함수

      선형 함수는 f(x) = ax + b 와 같이 입력이 상수배만큼 변하는 함수입니다.


      https://blog.kakaocdn.net/dn/sg8FA/btrsveEuHnl/mBhR0YtAfwrKdYYYGceGR0/img.png


      비선형 함수는 선형이 아닌 함수를 의미합니다.

      신경망에서 활성화 함수로 비선형 함수를 사용하는 이유는 선형 함수를 사용하면 신경망의 층을 아무리 깊게 해도 은닉층이 없는 네트워크로도 똑같이 표현할 수 있기 때문에 신경망에서 층을 깊게 하는 의미가 사라진다고 볼 수 있습니다.

      구체적으로 3층 신경망에서 위의 선형 함수를 활성화 함수로 사용한다고 가정하고 3층신경망을 식으로 나타내면

      https://blog.kakaocdn.net/dn/YqBmx/btrswWXC7oD/44EIKiYTg2W8PQ8epM3rkk/img.png

      위와 같이 x에 상수 c만 3번 곱한  y(x) = c * c * c * x 와 같은 계산이 됩니다.

      결론적으로 위 식은 선형 함수 y(x) = ax와 같다고 할 수 있습니다.

      이것은 은닉층을 쌓지 않은 단층 네트워크로도 표현할 수 있다는 뜻이기도 합니다.

      따라서  층을 깊게 쌓는 신경망의 이점을 살리기 위해서는 활성화 함수로 선형 함수가 아닌 비선형 함수를 사용해야합니다.


      (3) ReLU(Rectified Linear Unit)  함수

      입력이 0을 넘으면 그 값을 그대로 출력하고, 0 이하이면 0을 출력하는 함수입니다.


      https://blog.kakaocdn.net/dn/dpQ5b7/btrsvdS5WWc/KLbVxkgmGYph03TOIFADs1/img.png

      3층 신경망

      3층 신경망 구조& 표기법

      image.png


      - 각 층의 신호 전달 모습


      입력층에서 1층으로 신호전달

      위와 같이 편향을 뜻하는 뉴런이 추가되었고, 여기서 행렬의 곱을 이용하여 1층의 가중치 부분을 다음 식처럼 간소화 할 수 있습니다. 행렬의 구성은 오른쪽 그림과 같습니다.



      그림으로 보는 신호 전달과정


      입력층에서 1층으로 신호전달


      1층에서 2층으로 신호전달


      2층에서 출력층으로 신호전달


      파이썬 코드로 3층 신경망 구현

      network = {}
      
      network['W1'] = np.array([[0.1, 0.3, 0.5], [0.2, 0.4, 0.6]])
      network['b1'] = np.array([0.1, 0.2, 0.3])
      
      network['W2'] = np.array([[0.1, 0.4], [0.2, 0.5], [0.3, 0.6]])
      network['b2'] = np.array([0.1, 0.2])
      
      network['W3'] = np.array([[0.1, 0.3], [0.2, 0.4]])
      network['b3'] = np.array([0.1, 0.2])
      
      return network
      
      W1, W2, W3 = network['W1'], network['W2'], network['W3']
      b1, b2, b3 = network['b1'], network['b2'], network['b3']
      
      a1 = np.dot(x, W1) + b1
      z1 = sigmoid(a1
      a2 = np.dot(z1, W2) + b2
      z2 = sigmoid(a2)
      a3 = np.dot(z2, W3) + b3
      y = identity_function(a3network = init_network(
      x = np.array([1.0, 0.5])
      y = forward(network, x)

      신경망의 출력층 설계

      기계학습 문제는 회귀(regression) 와 분류(classification) 로 나눌 수 있습니다.

      회귀는 입력 데이터에서 연속적인 수치를 예측하는 문제이고, 분류는 데이터가 어느 클래스(class)에 속하느냐는 문제입니다.

      출력층에서 사용하는 활성화 함수는 문제가 회귀이냐 분류이냐에 따라 달라집니다.

      보통 회귀 문제에서는 항등 함수(identity function) 를 사용하고 분류 문제에서는 소프트맥스 함수(softmax function) 를 사용합니다.


      항등 함수(identity function)

      image.png

      소프트맥스 함수(softmax function)

      image.png

      소프트맥스 함수를 구현해보면 밑과 같은 코드로 나타낼 수 있습니다.

      def softmax(a):
          exp_a = np.exp(a)
          sum_exp_a = np.sum(exp_a)
          y = exp_a / sum_exp_a
      
          return y

      소프트맥스 함수 구현 이슈

      소프트맥스 함수의 코드는 수식을 제대로 표현하고 있지만, 컴퓨터로 계산했을 때 오버플로(overflow) 문제가 발생합니다.

      지수 함수는 쉽게 아주 큰 값을 내기때문에 지수 숫자가 조금씩 커져도 결과 값은 많이 커지는 경우가 많아 큰 값끼리 나눗셈을 하면 결과 수치가 불안정해지는 문제가 발생합니다.


      https://blog.kakaocdn.net/dn/6JMBs/btrsveSIXMG/Yj1OShqJD6HtsWDcdRbTXk/img.png


      따라서 위의 수식과 같이 기존 수식에서 임의의 정수 C를 분자와 분모에 곱해 오버플로를 방지하는 수식으로 개선할 수 있습니다.

      오버플로를 막기 위해서 C에서 입력 신호 중 최대값을 넣어 빼주는 방식으로 개선한 코드를 구현해보았습니다.

      def softmax(a):
          c = np.max(a)
          exp_a = np.exp(a - c)
          sum_exp_a = np.sum(exp_a)
          y = exp_a / sum_exp_a
      
          return y

      닫는 이야기

      이상으로 저희의 다독다독 여정은 끝이 났습니다.

      관심 있는 분야의 책을 읽으며 얻는 것도 많았고, 알아가는 것도 많아져 성장하는 저희가 되었습니다.

      더이상 아무것도 모르지는 않는 아무것도모르조의 앞으로의 활동도 기대해 주세요! 긴 글 읽어 주셔서 감사합니다.

      댓글 0

      DEVOTEE를 활성화 시키면
      지금 작성한 댓글에 AI가 댓글을 달아줍니다.

      clyde17 님의 최신 블로그

      더보기
      동영상 기고하기