Return to Video

PyTorch Lecture 13: RNN 2 - Classification

  • 0:00 - 0:04
    이 강의에서는
    두 번째 RNN에 대한 이야기를 하겠습니다
  • 0:04 - 0:07
    분류 작업을 중심적으로 보도록 하죠
  • 0:07 - 0:12
    이전 강의에서
    일반적 RNN 모델에 대해 배웠죠
  • 0:12 - 0:15
    먼저 x를 입력으로 넣으면
  • 0:15 - 0:19
    간단한 룩업 테이블인
    임베딩층을 거쳐서 나오는
  • 0:19 - 0:26
    임베딩 출력값을
    RNN의 입력으로 사용합니다
  • 0:26 - 0:31
    그리고 맨 위쪽에는
    완전연결층을 추가해서
  • 0:31 - 0:33
    출력값들을 생성합니다
  • 0:33 - 0:36
    작업의 종류에 따라서
    다른 손실 함수를 사용할 수 있는데요
  • 0:36 - 0:42
    여기에서 우리가 사용한 예시에서는
    크로스-엔트로피를 사용했습니다
  • 0:42 - 0:48
    좀 더 정확하게 말하자면
    우리는 시계열 입력을 사용했습니다
  • 0:48 - 0:50
    각 셀은 출력값을 생성하고
  • 0:50 - 0:54
    주어진 레이블과 이 출력값을
    비교해볼 수 있죠
  • 0:54 - 0:57
    따라서 손실을 계산할 수 있습니다
  • 0:57 - 1:00
    그리고 이 손실을 가지고
    모델을 훈련시키는데
  • 1:00 - 1:04
    이것이 일반적으로 RNN에서
    손실을 구하고 훈련시키는 방법입니다
  • 1:04 - 1:07
    다양한 방법으로
    RNN을 연결할 수 있는데요
  • 1:07 - 1:16
    굉장히 다양한 모델과
    응용 방법을 고려할 수 있죠
  • 1:16 - 1:23
    이 강의에서는 한 가지 모델에
    대해서만 보도록 할 것인데요
  • 1:23 - 1:24
    RNN 분류라고 불리는 것에
    대한 내용입니다
  • 1:24 - 1:27
    이러한 형태로 모든
    RNN을 연결할 수 있죠
  • 1:27 - 1:31
    시계열 입력을 사용할 수 있습니다
  • 1:31 - 1:34
    하지만 여기서는 마지막에 나오는
    출력값만 사용할 것입니다
  • 1:34 - 1:36
    이것을 출력으로 사용하는 것이죠
  • 1:36 - 1:40
    이러한 형태는 종종
    시계열 기반 분류나
  • 1:40 - 1:44
    감성 분석 등에 사용됩니다
  • 1:44 - 1:51
    이번 강의에서는 이 RNN 모델로
    이름 분류 작업을 해보도록 하겠습니다
  • 1:51 - 1:53
    우리가 사용한 데이터는
    이러한 형태이고요
  • 1:53 - 1:56
    주어진 이름들이 있고
  • 1:56 - 1:58
    각각에 해당하는 나라들이 있습니다
  • 1:58 - 2:02
    예를 들어서 Malouf라는 사람은
    아랍에서 온 사람이죠
  • 2:02 - 2:07
    Taerajima라는 사람은
    일본인이고요
  • 2:07 - 2:08
    Huie는 중국인입니다
  • 2:08 - 2:12
    따라서 주어진 이름에 대해
    나라를 예측해보려 합니다
  • 2:12 - 2:15
    이 데이터셋에는
    18개의 나라가 있기 때문에
  • 2:15 - 2:20
    이 18개 나라에 대한
    소프트맥스 출력값을 만들게 됩니다
  • 2:20 - 2:23
    입력값으로는
    전체 이름을 넣을 것인데요
  • 2:23 - 2:27
    이것을 각 글자로 나누어서
  • 2:27 - 2:30
    각 셀에 한 글자씩
    넣어주게 될 것입니다
  • 2:30 - 2:34
    이게 우리가 사용할
    기본적 모델입니다
  • 2:34 - 2:36
    이 모델을 디자인할 때
  • 2:36 - 2:38
    확실하게 해야 할 한 가지는
  • 2:38 - 2:41
    어떻게 입력 공간을
    디자인하는지에 대한 것입니다
  • 2:41 - 2:47
    이 경우에 각 셀에 대한
    입력값은 각 글자가 됩니다
  • 2:47 - 2:51
    그러면 RNN에 들어가게 될
    각 입력은 어떻게 될까요?
  • 2:51 - 2:53
    물론 나중에
    임베딩도 사용하게 될 겁니다
  • 2:53 - 2:54
    이건 룩업 테이블의 일종이죠
  • 2:54 - 2:58
    주어진 글자에 대해서
    각 인덱스를 가지게 됩니다
  • 2:58 - 3:03
    따라서 각각의 고유한 글자를
    구분할 수 있게 되죠
  • 3:03 - 3:04
    그리고 어떤 단어를 만들면
  • 3:04 - 3:08
    이 단어의 식별자를
    룩업 테이블에서 찾을 수 있습니다
  • 3:08 - 3:13
    이 경우에는 각 입력이
    영어 알파벳이라는 것을 알기 때문에
  • 3:13 - 3:16
    여기서는
    아스키 코드를 사용할 수 있습니다
  • 3:16 - 3:20
    따라서 이것을
    인덱스로 바로 사용할 수 있어요
  • 3:20 - 3:22
    예를 들어서
    여기에 있는 'a'에 대한
  • 3:22 - 3:24
    아스키 코드는 97이 되고
  • 3:24 - 3:29
    97은 임베딩에서의
    값을 찾는데 사용됩니다
  • 3:29 - 3:32
    따라서 임베딩의 출력값은
    이런 형태가 되죠
  • 3:32 - 3:37
    그리고 이 값들이
    RNN의 입력으로 사용됩니다
  • 3:37 - 3:39
    예를 들어 보겠습니다
  • 3:39 - 3:42
    adylov라는 이름이
    있다고 해봅시다
  • 3:42 - 3:43
    특정한 이름이 있고
  • 3:43 - 3:47
    이것을 각 글자로 나눕니다
  • 3:47 - 3:53
    그리고 각 글자에 대한
    아스키 코드를 식별자로 사용하는 거죠
  • 3:53 - 3:56
    이제 이 값을 인덱스로 사용합니다
  • 3:56 - 4:01
    룩업 테이블인
    임베딩층을 통과시키면
  • 4:01 - 4:03
    97과 100이라는 인덱스는
  • 4:03 - 4:06
    룩업 테이블로부터
    이러한 값을 얻게 됩니다
  • 4:06 - 4:10
    물론 이 값은 임베딩에서
    훈련될 수 있는 값입니다
  • 4:10 - 4:12
    이제 이 값을 입력값으로 사용합니다
  • 4:12 - 4:20
    이 입력값은 역전파를 이용해
    훈련될 수 있다는 것이죠
  • 4:20 - 4:25
    소스 코드에서는
    어떻게 이 글자들을
  • 4:25 - 4:28
    아스키 코드로 변환할까요?
  • 4:28 - 4:31
    코드 한 줄이면 할 수 있는데요
  • 4:31 - 4:32
    주어진 이름에 대해서
  • 4:32 - 4:36
    각 글자를 얻어낸 다음에
  • 4:36 - 4:38
    ord 함수를 호출합니다
  • 4:38 - 4:41
    이 함수는 아스키 코드를 반환해주죠
  • 4:41 - 4:44
    그리고 이것에
    리스트 변환을 사용하면
  • 4:44 - 4:47
    배열을 생성할 수 있고
    이것을 반환하면 됩니다
  • 4:47 - 4:50
    이제 임베딩은 상당히 간단해지죠
  • 4:50 - 4:53
    간단하게 여기서
    임베딩 레이어를 하나 생성하는데
  • 4:53 - 4:56
    input_voc_size를 넣어주죠
  • 4:56 - 4:58
    단어의 개수가 몇 개인지를
    나타내는 값입니다
  • 4:58 - 5:01
    아스키 코드의 개수가 되겠죠
  • 5:01 - 5:03
    그리고 여기는
    출력의 크기인데요
  • 5:03 - 5:06
    이 부분은 결국
    RNN의 입력값이 될 겁니다
  • 5:06 - 5:09
    따라서 RNN 입력 크기이면서
    임베딩의 출력이 되는 것이죠
  • 5:09 - 5:11
    이제 이 레이어를 생성한 후에
  • 5:11 - 5:13
    입력을 넣어줍니다
  • 5:13 - 5:18
    따라서 임베딩의
    출력값이 만들어지죠
  • 5:18 - 5:22
    그리고 이 값이
    RNN의 입력값으로 들어갑니다
  • 5:22 - 5:24
    전체 소스코드를 보도록 하죠
  • 5:24 - 5:27
    이 부분이 메인 모듈이 되는데요
  • 5:27 - 5:32
    우리가 RNN 분류기를
    생성한다고 해 봅시다
  • 5:32 - 5:37
    먼저 주어진 하이퍼파라미터에 대해서
    RNN을 생성합니다
  • 5:37 - 5:40
    주어진 이름에 대해서
    해야하는 것은
  • 5:40 - 5:43
    아스키 배열을 만드는 것인데요
  • 5:43 - 5:47
    이 배열을
    tensor와 variable에 넘기고
  • 5:47 - 5:48
    PyTorch Variable이죠
  • 5:48 - 5:49
    이것을 입력값으로 사용합니다
  • 5:49 - 5:52
    그리고 이 값을 앞으로 넘겨줍니다
  • 5:52 - 5:55
    분류기에 넣어주는 것이죠
  • 5:55 - 5:57
    이렇게 출력값을 얻을 수 있습니다
  • 5:57 - 6:00
    여기서 계수를 주의 깊게
    볼 필요가 있는데요
  • 6:00 - 6:02
    입력과 출력의 형태이죠
  • 6:02 - 6:07
    입력값은
    6개의 글자로 이루어지고요
  • 6:07 - 6:09
    입력의 개수는 1개입니다
  • 6:09 - 6:11
    따라서 (1, 6)이 되죠
  • 6:11 - 6:15
    그리고 출력에 대해서는
    18개의 다른 출력값을 만들 겁니다
  • 6:15 - 6:17
    18개의 나라를
    예측하고자 하기 때문이죠
  • 6:17 - 6:19
    출력은 이렇게 되죠
  • 6:19 - 6:22
    이제 RNNClass를 봅시다
  • 6:22 - 6:28
    초기화하는 부분에서는
    여러 개의 하이퍼파라미터가 있습니다
  • 6:28 - 6:35
    그리고 하이퍼파라미터를 설정한 후
    세 개의 레이어를 만드는데요
  • 6:35 - 6:37
    가장 먼저 임베딩이 나옵니다
  • 6:37 - 6:41
    임베딩은 input_size와
    hidden_size를 넣어줍니다
  • 6:41 - 6:44
    hidden_size는
    RNN 입력의 크기가 되죠
  • 6:44 - 6:47
    여기에서는 RNN으로
    GRU를 사용할 건데요
  • 6:47 - 6:50
    여기서도 입력의 크기와
    출력의 크기를 정해 줍니다
  • 6:50 - 6:53
    이 RNN의 경우에는
    서로 동일한 크기를 가집니다
  • 6:53 - 6:55
    hidden_size를
    입력의 크기로 사용함과 동시에
  • 6:55 - 6:58
    hidden_size를
    출력의 크기로도 사용합니다
  • 6:58 - 7:03
    그리고 가장 윗부분에
    완전연결층을 연결합니다
  • 7:03 - 7:07
    여기서는 선형 레이어을 사용하는데요
  • 7:07 - 7:09
    입력의 크기로 hidden_size를 사용하고
  • 7:09 - 7:12
    출력의 크기로 18을 사용하죠
  • 7:12 - 7:14
    출력의 크기로 18을 사용하죠
  • 7:14 - 7:16
    이렇게 여러 레이어를 정의하고
  • 7:16 - 7:19
    forward 모듈에서는
    이것들을 모두 연결합니다
  • 7:19 - 7:22
    적절한 순서로
    적절한 입력값을 넣어줍니다
  • 7:22 - 7:24
    여기서 입력을 받는데요
  • 7:24 - 7:30
    입력은 여기서 생성됩니다
  • 7:30 - 7:32
    이 값을 입력값으로 사용합니다
  • 7:32 - 7:35
    입력값에 대해 더 자세히 보자면
  • 7:35 - 7:41
    입력의 형태는
    배치 크기 × 시퀀스 크기가 됩니다
  • 7:41 - 7:43
    여기서 배치의 크기는 1이고
  • 7:43 - 7:48
    6개의 글자를 사용하기 때문에
  • 7:48 - 7:51
    이 값이 입력의 크기가 되죠
  • 7:51 - 7:54
    하지만 우리가
    사용하는 GRU에서는
  • 7:54 - 7:57
    여기에서 batch_first를
    사용하지 않았기 때문에
  • 7:57 - 8:01
    GRU의 입력값은
    이런 형태가 됩니다
  • 8:01 - 8:06
    따라서 이렇게 시퀀스
    배치, 입력값을 얻게 됩니다
  • 8:06 - 8:08
    이것이 GRU를 통해
    얻을 수 있는 값이죠
  • 8:08 - 8:11
    이제 우리가 먼저 해야할 것은
  • 8:11 - 8:13
    이 input을 전치시키는 것인데요
  • 8:13 - 8:17
    따라서 B × S를 S × B로 바꿀 수 있죠
  • 8:17 - 8:19
    이것을 전치시킨 후에
  • 8:19 - 8:24
    이 입력값을
    임베딩에 바로 넣어줍니다
  • 8:24 - 8:28
    출력값은
    이렇게 될 것입니다
  • 8:28 - 8:36
    임베딩된 출력값은
    S × B × I가 될 것입니다
  • 8:36 - 8:42
    이제 이것을
    GRU의 입력값으로 사용하게 되죠
  • 8:42 - 8:44
    이 값이 입력값이 됩니다
  • 8:44 - 8:46
    그리고 은닉 값도 만들어야 하는데요
  • 8:46 - 8:49
    초기 은닉 값으로 넣어줘야 하죠
  • 8:49 - 8:54
    마지막으로 볼 부분은
    출력값을 넣어주는 부분입니다
  • 8:54 - 8:59
    마지막 출력값을
    완전연결층에 넣어주는 거죠
  • 8:59 - 9:03
    여기서 약간의
    트릭을 사용할 것인데요
  • 9:03 - 9:09
    마지막 레이어에서의
    출력값은
  • 9:09 - 9:12
    또 다른 은닉값이 됩니다
  • 9:12 - 9:13
    기본적으로는
    동일한데요
  • 9:13 - 9:16
    따라서 이 은닉값을
    입력값으로 사용할 것입니다
  • 9:16 - 9:24
    여기서 이렇게 은닉값이
    각 셀의 입력값으로 사용되었죠
  • 9:24 - 9:27
    그리고 다시 은닉값을 반환합니다
  • 9:27 - 9:33
    이 은닉값은 이제
    완전연결층의 입력으로 사용됩니다
  • 9:33 - 9:38
    그리고 이것의 출력값을
    마지막에 반환합니다
  • 9:38 - 9:41
    물론 이 출력값도 사용할 수 있습니다
  • 9:41 - 9:44
    모든 내용을 포함하는
    것이기 때문인데요
  • 9:44 - 9:48
    이 마지막 출력값만을
    은닉값과 같은 것으로 사용할 수 있습니다
  • 9:48 - 9:50
    간단하게 만들기 위해서는
  • 9:50 - 9:58
    이 은닉값을 완전연결층의
    입력값으로 사용하면 됩니다
  • 9:58 - 10:04
    다시 한 번 주의깊게
    보아야 할 부분은 이 부분입니다
  • 10:04 - 10:05
    전치시키는 과정과
  • 10:05 - 10:08
    입력값을 올바른 계수로 만드는 부분이죠
  • 10:08 - 10:11
    여기에 초기 입력값이 있고요
  • 10:11 - 10:14
    주어진 입력값은
    이렇게 생겼죠
  • 10:14 - 10:17
    이 값을 전치시킬 건데요
  • 10:17 - 10:21
    전치시킨 후에
    얻게되는 입력값은
  • 10:21 - 10:23
    이런 형태가 되겠죠
  • 10:23 - 10:26
    이제 룩업 테이블을 봅시다
  • 10:26 - 10:32
    여기서 얻어진 embedded가
    이렇게 될 겁니다
  • 10:32 - 10:41
    이 임베딩은
    RNN의 입력값이 되겠죠
  • 10:41 - 10:45
    하지만 우리는 한 번에
    여러 개의 이름을 다룰 수 있어야 합니다
  • 10:45 - 10:47
    여러 개의 주어진 이름에 대해
  • 10:47 - 10:50
    반복문을 이용해서
    한 개씩 처리할 수 있겠죠
  • 10:50 - 10:51
    하지만 그리 효율적이진 않습니다
  • 10:51 - 10:56
    배치를 이용하면
    이 모든 입력을 다룰 수 있습니다
  • 10:56 - 10:59
    이것들을 모두 합칠 수 있는 겁니다
  • 10:59 - 11:00
    여기서 한 가지 문제는
  • 11:00 - 11:02
    이 부분에서 볼 수 있듯이
  • 11:02 - 11:03
    이 값이 입력값의 크기인데요
  • 11:03 - 11:08
    각 이름
    즉 각 문자열의 길이를 의미하죠
  • 11:08 - 11:09
    여기에 보이는 것처럼
  • 11:09 - 11:12
    다른 이름은
    길이가 달라질 수 있죠
  • 11:12 - 11:16
    따라서 이 부분에
    어떠한 것을 넣어줘야 하는 거죠
  • 11:16 - 11:18
    배치를 사용하기 위해서 말입니다
  • 11:18 - 11:20
    한 개씩 처리해도
    문제는 없지만
  • 11:20 - 11:22
    배치로 만들어 사용한다면
  • 11:22 - 11:26
    넣어주어야 하는 값에서
    약간 문제가 생기겠죠
  • 11:26 - 11:30
    가장 일반적인 해결 방법은
    제로 패딩이라는 것인데요
  • 11:30 - 11:37
    이 공간에 0을 넣는 방법입니다
  • 11:37 - 11:42
    이 부분이 문자열, 즉 이름의
    끝부분을 표시해주는 것이죠
  • 11:42 - 11:46
    이 코드 세 줄로
    이것을 구현할 수 있습니다
  • 11:46 - 11:50
    주어진 시퀀스와
    주어진 문자열 길이에 대해서
  • 11:50 - 11:55
    제로 패딩된 출력값을 생성할 수 있죠
  • 11:55 - 11:58
    먼저 모두 0인 상태에서 시작해서
  • 11:58 - 12:01
    실제 값을 넣어줍니다
  • 12:01 - 12:07
    따라서 제로 패딩 처리된
    배치 행렬을 얻을 수 있습니다
  • 12:07 - 12:09
    이런 형태를 가지고 있을 때
  • 12:09 - 12:11
    동일한 방법으로 여기에
  • 12:11 - 12:13
    embedding을 호출할 수 있는데요
  • 12:13 - 12:15
    따라서 임베딩을 생성해주죠
  • 12:15 - 12:20
    예를 들어 각 이름에 대해서
    임베딩을 생성하게 되면
  • 12:20 - 12:26
    이 임베딩을 RNN의 입력으로
    바로 사용할 수 있게 됩니다
  • 12:26 - 12:30
    이 부분은 이제 헬퍼 함수들을
    포함해 구현된 부분입니다
  • 12:30 - 12:34
    예를 들어 이 부분은
    문자열을 아스키 배열로 바꿔주고요
  • 12:34 - 12:38
    이 부부은 제로 패딩에 대한 것이죠
  • 12:38 - 12:44
    이 부분은 이름을
    variable로 만들어주는 추가적인 부분입니다
  • 12:44 - 12:46
    따라서 이 두 가지 함수를
    사용하고 있죠
  • 12:46 - 12:49
    이제 메인 함수에서는
    훨씬 간단합니다
  • 12:49 - 12:51
    이렇게 이름들이 있고
  • 12:51 - 12:56
    이 make_variable을 이용해
    배치 입력값을 만듭니다
  • 12:56 - 13:02
    그리고 이것을
    분류기에 넣어주면
  • 13:02 - 13:05
    출력값을 얻을 수 있습니다
  • 13:05 - 13:07
    입력값은 이런 형태가 되는데
  • 13:07 - 13:11
    최대 크기는 제로 패딩을 포함한
    최대 크기를 사용합니다
  • 13:11 - 13:15
    이 부분은 이름의 개수를 나타내죠
  • 13:15 - 13:17
    이 경우에는 배치의 크기가
    4임을 나타냅니다
  • 13:17 - 13:19
    따라서 출력의 크기는 18이면서
  • 13:19 - 13:21
    4개의 다른
    출력값들을 가지게 됩니다
  • 13:21 - 13:26
    각 이름에 대한 예측값이 되겠죠
  • 13:26 - 13:29
    훈련시키기 위해서는
    Adam 최적화와
  • 13:29 - 13:32
    크로스-엔트로피 손실 함수를
    사용할 수 있습니다
  • 13:32 - 13:36
    손실값의 criterion으로
  • 13:36 - 13:42
    예측값인 출력값과
    실제 레이블 타겟을 사용하여
  • 13:42 - 13:44
    손실값을 계산합니다
  • 13:44 - 13:47
    그리고 역전파인 backward를 수행하면서
  • 13:47 - 13:54
    이 최적화로
    훈련시킨 변수를 갱신해 줍니다
  • 13:54 - 13:58
    크기가 큰 행렬을 다룰 때에는
  • 13:58 - 14:00
    PackedSequnce를 사용할 수 있는데요
  • 14:00 - 14:03
    RNN 연산을
    더 효율적으로 만들어 줍니다
  • 14:03 - 14:08
    PyTorch에서 제공하는
    유틸리티 함수를 사용할 수 있는데요
  • 14:08 - 14:10
    꽤나 간단합니다
  • 14:10 - 14:15
    먼저 입력 배치를
    길이에 따라 정렬해야 하는데요
  • 14:15 - 14:18
    가장 긴 것부터
    나열하면 됩니다
  • 14:18 - 14:24
    물론 배치가 가지는
    전체 길이는 최대 길이가 되겠죠
  • 14:24 - 14:25
    이제 이것을 나열하고
  • 14:25 - 14:29
    임베딩과 같은
    전처리를 수행합니다
  • 14:29 - 14:34
    그리고 나서
    packing이라는 메소드를 호출합니다
  • 14:34 - 14:38
    그러면 이렇게 모두
    하나로 합쳐진 것을 얻을 수 있습니다
  • 14:38 - 14:43
    이것을 RNN의
    입력으로 사용할 수 있는데요
  • 14:43 - 14:45
    이렇게 합쳐진 입력값은
  • 14:45 - 14:48
    이 RNN을 훨씬
    효율적으로 만들어줍니다
  • 14:48 - 14:51
    그렇게 출력값을 생성하는데요
  • 14:51 - 14:54
    이 출력값을 다시 언팩킹해서
  • 14:54 - 14:57
    바로 이 출력값을
    사용할 수 있게 만듭니다
  • 14:57 - 15:02
    깃헙 레포지토리에서
    더 많은 예시를 보실 수 있습니다
  • 15:02 - 15:05
    이것들을 모두
    더 효율적으로 만들어 볼 수 있겠죠
  • 15:05 - 15:10
    이 슬라이드에는
    팩킹과 언팩킹의 개념과
  • 15:10 - 15:15
    RNN에서 일반적인 형태의
    배치 입력과의 차이를 보여줍니다
  • 15:15 - 15:18
    동작을 효율적으로 만드는
    또 다른 방법은
  • 15:18 - 15:19
    GPU를 사용하는 것입니다
  • 15:19 - 15:23
    1개 이상의 GPU를 가지고 있다면
    데이터 병렬성을 활용할 수 있습니다
  • 15:23 - 15:26
    PyTorch에서 GPU를 사용하는 것은
  • 15:26 - 15:28
    굉장히 간단합니다
  • 15:28 - 15:30
    이 두 단계를
    따르기만 하면 되는데요
  • 15:30 - 15:34
    먼저 모든 변수를 GPU로 복사합니다
  • 15:34 - 15:40
    tensor.cuda()를 사용해서
    변수를 생성하면 됩니다
  • 15:40 - 15:45
    두 번째 단계는
    모델을 GPU에 복사해 넣습니다
  • 15:45 - 15:48
    그러면 각 모델은 GPU로부터
    데이터를 바로 읽어들일 수 있죠
  • 15:48 - 15:52
    이 모델을 사용한다면
  • 15:52 - 15:54
    여기에
    model.cuda()를 호출하면 됩니다
  • 15:54 - 15:57
    그러면 모델을
    GPU에 넣을 수 있습니다
  • 15:57 - 16:01
    이제 이 분류기를 그대로 사용해도
    아무런 문제가 없습니다
  • 16:01 - 16:04
    1개보다 많은 GPU를 가지고 있다면
  • 16:04 - 16:06
    병렬성을 활용할 수 있는데요
  • 16:06 - 16:08
    이것을 사용하는 방법 또한
    매우 간단합니다
  • 16:08 - 16:15
    가장 먼저 이런 식으로
    분류기를 생성하고
  • 16:15 - 16:16
    이 부분은
    실제 분류기입니다
  • 16:16 - 16:21
    그리고 이 분류기를
    데이터 병렬로 감싸줍니다
  • 16:21 - 16:24
    그러면 또 다른
    분류기를 생성하는데
  • 16:24 - 16:26
    이제 이 분류기를 사용하면 되죠
  • 16:26 - 16:28
    일단 입력 데이터를
    넣어주기만 하면
  • 16:28 - 16:32
    자동적으로 GPU 개수로
    나누어 줄 겁니다
  • 16:32 - 16:36
    그리고 PyTorch는
    자동으로 출력값을 병합해주죠
  • 16:36 - 16:38
    매우 편리합니다
  • 16:38 - 16:41
    이 데이터 병렬성에 대해
    더 알고 싶으시다면
  • 16:41 - 16:48
    PyTorch 문서에 있는
    저희가 만든 튜토리얼을 읽어보면 됩니다
  • 16:48 - 16:53
    연습 문제에서 이 강의에서
    다른 모든 부분을 해볼 수 있는데요
  • 16:53 - 16:55
    GPU를 사용하고
    데이터 병렬성을 사용하고
  • 16:55 - 16:57
    pad-pack을 사용해서
  • 16:57 - 17:01
    이름 분류를 구현할 수 있습니다
  • 17:01 - 17:03
    동일한 형태의
    모델을 사용해
  • 17:03 - 17:04
    더 많은 일을 할 수 있습니다
  • 17:04 - 17:09
    예를 들어 영화 리뷰에 대한
    감성 분석에 적용할 수 있죠
  • 17:09 - 17:11
    여기에 kaggle의 실제 데이터가 있습니다
  • 17:11 - 17:12
    이 데이터를 다운로드 받아서
  • 17:12 - 17:16
    주어진 리뷰에 대한
    감정을 예측할 수 있을 겁니다
  • 17:16 - 17:19
    이 5개의 레이블 중 하나가 되겠죠
  • 17:19 - 17:22
    다음 강의에서는 RNN으로
    언어 모델링을 해보도록 하겠습니다
Title:
PyTorch Lecture 13: RNN 2 - Classification
Description:

more » « less
Video Language:
English
Duration:
17:23

Korean subtitles

Incomplete

Revisions