본문 바로가기
전공/인공지능, ML, DL

[Deep Learning from Scratch 1] 밑바닥부터 시작하는 딥러닝 1 리뷰

by import ysy 2022. 6. 24.

학부 3학년, 신호처리 과목 조교님께서 요즘 공대 나와서 딥러닝도 모르면 안된다고 하셨다.
그러면 뭐부터 봐야 하냐고 물었더니 한 책을 소개해 주셨고 그 책이 유명한 그 책, 사이토 고키의 밑바닥부터 시작하는 딥러닝이었다.

유명하디 유명한 그 책


그래서 그 해 겨울에 한 번, 대학원을 결정하고 한 번, 대학원에서 스터디 하면서 한 번 읽었다.
전공자가 아니라도 편하게 읽을 수 있는 수준이고 실제로 주변에 많이들 이 책으로 입문한다.
이번에 마지막 복습이라고 생각하고 전공자를 위해 책을 정리해보려 한다.
내 글은 초심자를 위한 글은 아니고 어느 정도 경험이 있는 사람들을 위한 정리본 컨셉으로 이어질 것이다.


1. 헬로 파이썬

이 단원은 파이썬의 기본 동작을 설명하고 있는데 사실 책으로 배울 수 있는 수준은 아니고 책으로는 이런이런 개념을 기억한다는 확인용으로 쓰면 될 것 같다.
복습하는 사람들은 다 알고 있는 내용일테니 알아서 읽어보기.
여기서 언급하고 있는 개념은 list를 비롯한 자료형과 브로드캐스트(broadcast), 반복문, 함수, 그리고 numpy와 같은 라이브러리 등이 있다.

그런데 페이지 32쪽에 Warning 박스에 이런 말이 있다.

공백 대신 tab 문자를 써도 되지만 파이썬에서는 공백 문자 쪽을 권장합니다.
그리고 한 단계 더 들여 쓸 때마다 공백 4개씩을 더 추가하는 것이 일반적입니다.

tab은 space 4번과 같다. 그런데 파이썬에서 space쪽을 권장한다는 자료는 아쉽게 찾지 못했다.
파이썬에 tab을 space 4번으로 바꿔주는 명령어가 있는데 그것 때문일까?
아는 사람은 댓글로 답변 부탁드린다.

2. 퍼셉트론

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

퍼셉트론


그림의 원을 뉴런이나 노드라고 부르며 신호가 전달될 때는 각각 고유한 가중치가 곱해진다.
그리고 신호의 총합이 정해진 한계(임계값)를 넘으면 1을 출력한다.
이러한 퍼셉트론을 이용해서 AND, OR과 같은 Gate를 설계할 수 있다.
다만 XOR Gate와 같은 비선형 연산은 표현하지 못한다는 한계가 있다.
이럴 때는 다층 퍼셉트론(Multi-layer perceptron)으로 해결할 수 있다.
퍼셉트론의 층은 더 다양한 것을 표현할 수 있다.

편향을 표시한 퍼셉트론

사실 조금 일반적으로는 편향(bias)가 포함된 아래 모습이 좀 더 일반적이다.

3. 신경망

2층 신경망

해당 그림은 0층인 입력층부터 총 2층 신경망을 표시한 것이다.

활성화 함수(activation function)란?
입력 신호의 총합을 출력 신호로 변환하는 함수.

렐루 함수(ReLU function)
ReLU는 Rectified Linear Unit의 약자인데,
직역하면 정류된 선형 단위 함수라는 뜻이다.
ReLU라고 하면 뭔가 간지난다.

활성화 함수의 장단점 비교는 면접 질문이나 기계학습개론 같은 교과목 문제로 자주 출제된다.
아래는 그 예시들이다.

sigmoid vs tanh
sigmoid vs step function
sigmoid함수는 연속적이고 계단함수는 0을 기준으로 0과 1값만을 출력한다.
하지만 입력의 범위가 어떻든간에 출력 범위는 0과 1사이라는 점과
입력이 커지면 출력도 1에 가까워지는(혹은 1이 되는) 구조라는 점이 공통적이다.
또한 두 함수 모두 비선형 함수로(대부분의 활성함수는 비선형함수)


또한 사용되는 활성화 함수는 모두 비선형 함수인데 그 이유도 잘 알아둬야 한다.
정확히는 선형함수를 사용하면 층을 깊게 하는 의미가 없음을 이해하고 있어야 한다.

선형함수를 이용하면 신경망의 층을 깊게 하는 의미가 없어진다.
즉 은닉층이 없는 네트워크로 표현할 수 있기 때문에
여러 층을 가지고 은닉층이 필요한 모델에서는 활성함수가 반드시 비선형이어야 한다.



활성화 함수. 이름부터 어떤 값을 activate시키는 값이다.

또한 이 단원에서 행렬곱에 대해서 다루는데
행렬곱 수행 시 첫번째 행렬의 열과 두번째 행렬의 행의 차원을 일치시켜야 한다.
이러한 차원 맞추기는 앞으로 계속 신경써주어야 할 부분이다.


출력층 구현

출력층에서는 크게 두 개의 함수를 사용하곤 한다.
1. 항등함수(indentity function)
입력을 그대로 출력하여 이전 layer의 결과를 그대로 반환한다.

2. 소프트맥스 함수(softmax function)

softmax


여기서 n은 출력층의 뉴런 수, k는 n 중에서 k번째임을 나타낸다.
classification(분류)문제에서 자주 사용한다.
그런데 지수함수를 사용하면 값이 쉽게 커지기 때문에 결과수치가 불안정해지곤 한다.
그래서 실제로 구현할 때는 아래와 같이 구현한다.


overflow를 막기위한 노력…

그런데 소프트맥스의 출력은 0과 1사이의 실수이고 모든 출력의 합은 1이 된다.
즉 소프트맥스 함수의 출력은 확률과 같다고 볼 수 있다.
따라서 그 결과를 확률이나 통계적 관점에서 바라볼 수 있다는 것이다.

하지만 우리가 확률로 이해할 수 있도록 바꾸어 준다지만 대소관계가 바뀌지 않기 때문에
지수함수 계산 비용을 줄이고자 출력층의 softmax연산은 생략되곤 한다.

출력층의 차원

classification(분류)문제의 경우 출력층의 차원은 class, 즉 분류하고 싶은 대상의 수로 설정한다.
예를들어 손글씨 숫자 0부터 9까지를 구분하고 싶다면 출력층 뉴런은 10개가 되는 것이다.


layer의 출력값들은 어떻게 처리할까

layer를 통과한 데이터들을 우리가 원하는 형태로 변형시키곤한다.
데이터를 특정 범위로 변환하는 처리를 정규화(normalization)
신경망의 입력 데이터에 특정 변환을 가하는 것을 전처리(pre-processing)이라고 한다.


배치(batch)

입력데이터를 묶어 한 번에 연산처리하는데 이 때 묶은 데이터를 batch라고 한다.
다발이나 묶음이라고 이해하면 된다.

이렇게 하는 이유는 입력 하나 당 처리시간을 대폭 줄여주기 때문이다.
처리시간이 주는 이유는 아래 두가지 이유에서다.

1. 수치 계산 라이브러리 대부분이 작은 배열 여러 개보다 큰 배열을 한 번 처리하는 것이 더 효율적이도록 최적화되어 있다.
2. 데이터가 전송될 때 병목현상이 생길 수 있는데 배치를 통해 부하를 줄일 수 있다.
I/O작업 횟수가 줄기 때문에 CPU/GPU가 순수 연산에 더 힘을 쓸 수 있기 때문이다.

pickle

MNIST예제와 관련하여 이 책에서 load_mnist함수로 이터넷의 MNIST데이터셋을 읽어오는데
최초 실행 시에는 인터넷에서 받아오느라 오래 걸리고
이후에는 로컬에 저장된 pickle파일을 읽기에 빠르다고 한다.

pickle파일이란 파이썬 프로그램 실행 중에 특정 객체를 파일로 저장한 것이다.
이 파일을 로드하여 과거 실행 당시의 객체를 즉시 복원할 수 있다.
이렇게 하면 매번 객체를 생성할 필요없이 빠르게 작업이 가능하다.

신경망에서 피클파일은 가중치와 편향 매개변수가 딕셔너리 변수로 저장되어 있곤 한다.

반응형

댓글