[음악] 리커런트 뉴럴 네트워크에 대해 말씀드리겠습니다. 앞에서는 컨볼루셔널 뉴럴 네트워크, CNN에 대해서 말씀드렸고요, CNN은 대표적인 시퀀셜 데이터, 이미지 처리에 많이 사용된다고 말씀드렸죠? 리커런트 뉴럴 네트워크도 시퀀셜 데이터에 많이 사용되는데요, 리커런트 뉴럴 네트워크의 경우 텍스트 데이터, 자연어 처리에 많이 사용됩니다. 말씀드린 대로 시퀀셜 데이터는 굉장히 많은 종류가 있습니다. 스피치, 텍스트, 이미지가 있었는데, CNN은 이미지에서 많이 사용되고, 리커런트 뉴럴 네트워크인 LSTM, GRU 같은 경우는 텍스트 처리에 많이 사용됩니다. 이 두 가지의 특징이 있는데, CNN은 말씀드린 대로 로컬 피처를 찾는다고 했죠? 어떤 시퀀스가 주어지면 그 시퀀스에서 로컬 피처를 찾아서 가공하는 것이 CNN의 스타일입니다. RNN은 어떤 past로부터, 그것의 시퀀스를 누적해서 지나간 모든 시퀀스의 특징을 잡아내려는, 좀 글로벌한 피처를 잡는다고 해야 될까요? 그런 시도를 하는 특징이 있습니다. 이 두 개의 차이가 있고요. 차이가 있다는 얘기는 구조가 다르다는 뜻이 되겠죠. 그래서 구조가 어떻게 다른지 RNN의 구조에 대해 말씀드리겠습니다. 이건 리커런트 뉴럴넷 아닙니다. 이건 그냥 풀리 커넥티드 뉴럴넷이고요. 결국 RNN도 풀리 커넥티드 뉴럴넷의 일종입니다. 그래서 풀리 커넥티드 뉴럴넷을 변형시키는 데부터 시작합니다. 그래서 이렇게 생긴 풀리 커넥티드 뉴럴넷에 이렇게 생긴 c라는 것이 하나 추가됩니다. 이 c는 뉴럴넷의 일부이긴 하지만, 좀 이상하게, 좀 다르게 동작한다고 말해야 합니다. 이건 노드처럼 생겼지만 노드는 아니고 일종의 메모리예요. '그럼 뭘 저장하느냐?'라는 게 있겠죠. 이건 일종의 메모리가 되겠고, 이 메모리가 어떻게 동작하는지 RNN의 동작을 보면서 말씀드리겠습니다. 위쪽의 노드들은 뉴럴넷입니다. 위쪽의 동그라미들은 다 뉴럴넷의 노드이고요, 밑에 있는 c라는 것은 뉴럴넷의 일부이기는 하지만 뉴럴넷의 노드는 아니고, 메모리예요. 메모리인데 어떻게 동작하는지 한번 보면서 말씀드릴게요. 처음에 이렇게 입력이 들어왔습니다. 입력이 탁 들어오고 나면 그 입력이 커넥션을 따라서 다음 노드로 프로퍼게이션되겠죠? 네, 포워드 프로퍼게이션됩니다. 그래서 입력, 웨이트, 입력, 웨이트, 입력, 웨이트 해서, 각 노드들이 계산을 해주겠죠. 계산한 값이 여기 띵, 하고 들어간다고 합시다. 이렇게 계산된 값이 탁, 하고 들어가면 그다음에 어떤 일이 일어나는가? 여러분 다 아시다시피 이것이 다시 입력, 웨이트, 입력, 웨이트 해서 다음으로 또 계산되죠? 그러면서 동시에 이 링크 있죠? 이쪽 잘 보시면 이 c라는 것이 링크 모양이 좀 다르죠? 이쪽에서 이리로 가는 건 1-to-1으로 연결되어 있어요. h1이 c1으로, h2가 c2로, ..., hk가 ck로 1-to-1으로 매핑되어 있는데, 이쪽에서 보시면 여기서 풀리 커넥티드되어 있죠? 이렇게 연결, 연결, 연결. 얘도 연결, 연결, 연결. 연결해서 이쪽은 1-to1, 이쪽은 1-to-many로, 모든 애들과 풀리 커넥티드되어 있다는 걸 아실 수 있습니다. 자 그러면 중간에 계산된 이 h 값이 들어오면 어떻게 하는가? 다음에 띵, 하고 넘어가면서, 이 값이 이쪽으로 뉴럴넷처럼... 그러니까 위쪽은 그냥 뉴럴넷처럼 쭉 지나가는 겁니다. 위쪽은 데이터가 들어오면 뉴럴넷, 여러분이 하시다시피, 입력, 웨이트, 입력, 웨이트, 써메이션, 그다음 액티베이션, 입력, 웨이트, 입력, 웨이트, 써메이션, 액티베이션 해서, 그냥 쭉 하고 지나가고요. 여기 밑에서 어떻게 동작하냐면, 여기서 계산된 값이 파란색이죠? 파란색은 카피가 되어서 넘어가요. 다시 말해 h1 값이 계산되어 있잖아요? h1값이 카피되어 c1으로 넘어가고, h2가 카피해서 c2로 넘어가고, hk가 카피해서 ck로 넘어가는, 구조로 되어 있습니다. 그러니까 여기서는 이쪽으로 따라오면서 뉴럴넷을 빠져나가면서 아래쪽으로는 카피해서 저장이 되는 거죠. 이렇게 해서 그다음에 여기서 계산되어서 빠져나가게 되겠죠. 그후에는 어떤 일이 생기냐. 위쪽에서는 계산되어서 값이 빠져나가고, 밑에서는 아까 저장된 값이 계속해서 저장되어 있습니다. 보시면 제가 색을 칠해놨죠? 값이 띵, 하고 빠져나가고, 아까 여기서 카피된 값은 여전히 남아 있습니다. 자, 이 값도 빠져나가서 뉴럴넷은 프로세스가 끝난 상태겠죠? 입력이 들어와서 빠져나가면 끝이지만, 여기는 아까 저장되어 있던 값, h1, h2, ..., hk 값이 띵띵띵 계속 저장되어 있어요. 왜냐하면 메모리라고 말씀드렸죠? 그러다가 다음 입력이 탁, 하고 들어오면, 두 번째 입력이 되겠죠. 두 번째 입력이라 함은 두 번째 트레이닝 데이터라고 생각하시면 돼요. 아까는 첫 번째 트레이닝 데이터가 슉, 하고 빠져나갔고, 이제 두 번째 트레이닝 데이터가 들어왔다고 생각하죠. 두 번째 트레이닝 데이터가 들어오면 이건 아까 말씀드린 대로 위쪽은 그냥 뉴럴넷처럼 슉, 하고 지나갑니다. 그래서, 입력, 웨이트, 입력, 웨이트 하다가... 그런데 아까 밑에 저장되어 있던 것이 있죠? 여기에 아까 계산했던 값이, 즉 여기 h 값이 저장되어 있다고 그랬죠? 그 저장된 값이 이쪽으로 이렇게 다 들어가요. 이쪽으로 들어가면서, 이 노드에 대해서 h 노드에 대해 c 노드가 또 하나의 입력으로 사용됩니다. 다시 말씀드리면, 어떻게 되냐면, 이 h 입장에서는 입력이, 입력 웨이트, 입력, 웨이트, 입력, 웨이트. 어, 선이 너무 많네요. 그다음에, 입력, 웨이트, 입력, 웨이트, 써메이션, 액티베이션 해서 넘어가고요, 그다음에 h2 입장에서는 입력, 웨이트, 입력, 웨이트, 입력, 웨이트. 그다음에 입력, 웨이트, 입력, 웨이트, 입력, 웨이트, 써메이션, 액티베이션 해서, 값이 처리된다는 겁니다. 그러니까, RNN은 그냥 우리가 알고 있는 뉴럴넷하고 똑같다. 그런데 거기에 c라는 메모리가 하나 더 추가가 되었고, 이것은 이 히든 레이어에 있는 값, 계산한 값을 저장하고 있다가, 그다음 타임에 그다음 시간에 마치 h에 들어가는 입력처럼 사용이 된다. 그러니까 여기에 리커런트한 루프가 있죠? 네. Recurrent loop가 존재합니다. 그래서 이름이 리커런트 뉴럴 네트워크라 부르게 되고요. 그냥 똑같습니다. h가 계산되면 이게 빠져나가면서 다시 카피해서 다시 c로, 값이 띵, 하고 저장이 되고, 이것이 계속 반복하면서 돌아가는 뉴럴넷이 되겠습니다. 물론 여기까지 말씀드리면, 뭐 계산이야 뭐 그렇게 계산이 되는구나, 라고 여러분이 느끼실 텐데, 문제는, 도대체 저 계산의 의미가 뭐냐? 무슨 의도로 저런 계산을 하게 되냐? 저 계산을 하면 우리가 어떤 효과를 얻을 수 있냐? 그것에 대해 여러분이 조금 고민을 하실 것 같아요. 그런데 일단 그 고민은 잠깐 접어두시고. 이 리커런트 뉴럴넷이 동작하는 것, 기계적인 동작이죠? 기계적인 동작에 대해서는 여러분이 잘 알아두시면 좋겠다는 겁니다. 일단 기계적인 동작이 잘 들어오지 않으면 그 의미나 의도가 잘 와닿지 않거든요. 그래서 다시 말씀드리면, 입력이 들어오면 그 입력이 슉, 하고 위에서는 빠져나간다. 그다음에 여기서 계산된 값이 카피해서 c라는 곳에 저장된다. 저장되면 이건 그다음 타임에... 이 h에 대해서 다음 타임이라는 건 다음 입력, 다음 트레이닝 데이터, 혹은 다음 테스트 데이터를 말해요. 다음 트레이닝 데이터, 다음 테스트 데이터가 들어오면 그 시점에 대해서 이 c가 h에 대해서 또다른 입력으로 사용되어서 입력, 웨이트, 입력, 웨이트, 입력, 웨이트. 입력, 웨이트, 입력, 웨이트, 입력, 웨이트, 써메이션, 액티베이션해서 쭉 돌아가는 그런 구조가 된다고 말씀드렸습니다. 이렇게 돌아갑니다. 자 그러면 이 구조에 대해, 이렇게 돌아가는 것에 대해 의미를 좀 말씀드릴게요. 일단, 우리가 알고 있는 보통의 수퍼바이즈드 러닝에 대해 살펴보겠습니다. 예를 들어 여기 x1, y1이 있다고 하죠. 여기 x라는 건, 이 전체 있죠? 이 전체를 x1이라고 할게요. 첫 번째 트레이닝 데이터입니다. 왜냐하면, x가 벡터가 되겠죠? 보통 x가 벡터, y가 벡터니까. x 해서 그 벡터가 주어지면 첫 번째 트레이닝 데이터가 여기 딱 주어지겠죠? 이게 x1입니다. 자 그다음 이건 x2, y2. 트레이닝 데이터가 첫 번째 트레이닝 데이터, 두 번째 트레이닝 데이터... 보통 이렇게 있어요. 세 번째 트레이닝 데이터가 있고, 그다음에 네 번째, 다섯 번째... 쭉 있겠죠. 자, 여러분이 보통의 경우, 트레이닝 데이터, 수퍼바이즈드 러닝, CNN이 되었든 풀리 커넥티드 뉴럴넷이 되었든 학습을 시킨다고 했을 때, 학습시킨다고 했을 때, 여러분 아시다시피, 첫 번째 트레이닝 데이터에 이 데이터가 오고, 두 번째 트레이닝 데이터에 이게 오고, 이것이 세 번째에 올 이유가 있나요? 그러니까, 이 데이터가 세 번째여야 할 이유가 있으며 이게 두 번째여야 할 이유가 있냐? 사실은 없죠. 그냥 데이터를 나열하다 보니, 이게 첫 번째 데이터가 되었고, 이게 두 번째 트레이닝 데이터가 되었고, 이게 세 번째가 되었고... 그래서 여러분이 배치를 만들 때, 배치를 랜덤리 셔플링해도, 우리는 똑같은 거라고 생각하잖아요? 그쵸? 물론 순서가 바뀌면 학습에 영향을 주어서 똑같지는 않지만. 우리는 트레이닝 데이터를 랜덤리 셔플링해서 쓰기도 하잖아요? 순서는 전혀 중요하지 않아요. 그런데 리커런트 뉴럴 네트워크는 어떤 일이 생기냐면, 잘 보시면, x1이 들어갑니다. x1이 그러면 어떻게 되죠? 여기서 x1이 c1으로. c1이라는 건 이 전체를 c1이라고 할게요. 이게 전체 c1. 이제부터는 이 전체를, 벡터를 표현할게요. 여기 있는 1, 2는 뭐냐면 타임을 말해요. 첫 번째, 두 번째, 세 번째를 의미해요. 그래서 이 c1으로 저장이 되고, 그래서 이제 쑥 빠져나가요. 그랬다가 두 번째는 어떻게 되죠? 이것이 같이 이렇게 해가지고, 이걸로, 네, 아까는 이렇게 됐었죠? 이렇게 해서 y2로 결정을 하고, 그다음에 x2가 c2로 저장이 됐다가 다시 이렇게 해서 y가 결정되는 그런 구조가 됩니다. 잘 보시면, y3를 결정하는 데 참여한 애들이 누구예요? y3를 결정하는 데 참여한 애들을 보시면, x3뿐만 아니라 c2, c2라는 건 곧 x2를 의미하죠? 그런데 잘 보시면 이 구조가, 이 x2가 다시 말씀드려서 x1까지도 연결이 돼요. 그래서 이걸 조금 더 다시 말씀드리면, 이렇게 하는 게 더 맞기도 합니다. 다시 말씀드리면 이렇게 되는 거죠. 여기를 조금 바꿀게요. 우리가 지금까지 알고 있는 구조 말고, 예를 들어 우리가 여기서 어떻게 하냐면, 우리는 보통 x1, y1. 그렇죠? 그다음에 y2. 트레이닝 데이터가 이렇게 구성이 되어서, 뉴럴넷에 x1을 집어넣으면 y1이 나오고, x2를 집어넣으면 y2가 나오고. x3를 집어넣으면 x3가 나오는 이런 구조로 되어 있는데, 실제로 리커런트 뉴럴넷을 보면 어떻게 되죠? 이것이 h1을 만들고, h는, y를 만들어주고요. 그렇죠? 그다음에 이것이 어떻게 되죠? h2가 되는데, 이것은 이렇게 되죠? 왜냐하면 아까 저장됐던, C에, 이 C에 저장되었던 값, C까지 다 표현을 해볼까요? 그러면 이렇게 되는 거죠. 이것이, c1에, 이렇게 해서 이것이 c1으로 저장되었다가 c1이 이제 h2, 두 번째 트레이닝 데이터의 입력으로 들어가니까, 이것이 이렇게 결정이 되겠죠? 왜냐하면 뉴럴넷 구조를 보시면. 그래서 y라는 건 이 뉴럴 넷, x2가 h2로, h2가 y2로 가는데, y2라는 건 h2의 결과이고. 그런데 h2의 입력은 x2와 c1의, 결과가 되겠죠. 또 다시 이건 이렇게 해서 c2가 되고, 이건 h3가 되고, 이렇게 해서 이런 식으로 결과를 내겠죠. 지금 계산 path가 이런 식으로 생기게 돼요. 그러니까, 첫 번째 트레이닝 데이터, 두 번째 트레이닝 데이터, 세 번째 트레이닝 데이터가 있고, 이 y3라는 걸 잘 보시면, y3의 값이 결정되는 데 참여한 값들을 보시면, 어떤 애들이 다 참여했죠? 결국 x1이 이렇게 해서 영향을 줬고, x2가 이렇게 해서 영향을 줬고, x3가 이렇게 해서 영향을 줬죠. y3라는 걸 결정하는 데 궁극적으로 x1, x2, x3가 다 영향을 주었어요. 다시 말씀드리면, 이 x1과 x2가 위치가 바뀌었다. 혹은 이 x1, 2, 3의 위치가 바뀐 경우 y3의 값이 바뀔까요, 안 바뀔까요? 얘들 2개의 위치가 바뀌었다고 해보죠. x1 -> x2가 나오던 것이, x2 -> x1 -> x3로. 그러니까 트레이닝 데이터가 첫 번째, 두 번째, 세 번째가 있었는데, 랜덤리 셔플링해가지고 두 번째, 첫 번째, 세 번째가 되었다고 가정해보죠. 그러면 이 x3라는 값을 똑같이 주었어도 여기서 나오는 y3는 값이 바뀔 수밖에 없겠죠? 왜냐하면 앞서 계산되는 것을 보면, x1이 이 경로로, x2가 이 경로로, x3가 이 경로로 해서 y3한테 영향을 주는 그런 구조가 되어 있기 때문이죠. 바로 이 리커런트 뉴럴넷의 가정은 바로, 트레이닝 데이터가 첫 번째, 두 번째, 세 번째, 네 번째, 다섯 번째, 여섯 번째, 일곱 번째 트레이닝 데이터가 주어졌는데, 그 트레이닝 데이터가 그렇게 놓인 순서, 그 순서가 사실은 굉장히 중요한 거다, 라고 가정할 때, 여러분이 리커런트 뉴럴넷을 쓰시면 돼요. 그러니까 보통 경우와는 다르죠. Fully connected neural net이나 convolutional neural net은 우리가 어떻게 하죠? 그냥 첫 번째는 첫 번째고, 두 번째는 두 번째고, 세 번째는 세 번째고, 제대로 랜덤리 셔플링해도 아무 문제가 없고, 그냥 우리는 뭐 데이터를 1만 개 갖고 있었을 뿐이지, 1만 개가 꼭 그 순서로 나타내어져야 할 필요는 없는 거죠. 그런데 리커런트 뉴럴넷은 어떻게 이해를 한다? 그 데이터가 주어졌는데, 그 데이터가 이것이 첫 번째, 이것이 두 번째, 이것이 세 번째... 주어진 그 순서. 그 순서도 굉장히 중요하다. 그 순서에서 오는 패턴까지도 잡아내고 싶다, 라고 할 때, 이렇게 된다는 얘기입니다. 단지 세 번째 트레이닝 데이터의 y 값은 단순히 그것의 입력에 dependant하지 않고 누구에 dependant하지도 그 이전에 있었던 트레이닝 데이터의 입력에도 dependant하게 모델이 구성된 거다, 라는 걸 알 수 있습니다. 즉, 시퀀셜 데이터 처리에 적합한 데이터다라는 걸 알 수 있는 거죠. 예를 들어 그런 게 뭐가 있냐 하면 우리가 주식 값을 생각할 수 있죠. 여러분이 오늘의 종가를 보고 내일의 종가를 예측한다고 해봐요. 예를 들어 오늘 종가가 2000이었고 내일의 종가는 2050이라고 치죠. 그다음 내일의 종가는 2050, 그 다음날의 종가는 2100, 그다음의 2100이었고, 2200이라고 칩시다. 자, 그러면 이것이 2200인 이유는, 어제 2100이었기 때문에 2200이 되었나요? 아니면 첫째 날은 2000이었고 두 번째 날은 2050이고 세 번째 날은 2100, 다시 말해 계속 상승이죠? 상승하고 있잖아요. 상승하고 있으니까 여기도 2200이라고 말할 수 있냐? 라고 따지면, 당연히 이 앞에 있던 모든 히스토리가 여기에 영향을 준 거죠. 세상에 바로 전날 종가만 가지고 내일 종가를 예측하는 사람이 어디 있어요. 올라가는지, 내려가는지, 네, 반대로 했네요. 올라가는지, 내려가는지도 모르면서 맞출 수는 없겠죠? 이런 식으로 데이터가 주어진 것이 시퀀셜하게 주어졌다, 했을 때 리커런트 뉴럴넷을 쓰게 됩니다. 그래서 리커런트 뉴럴넷에 대해 기본적인 말씀을 구조에 대해 말씀을 드리면, 이렇게 되어 있습니다. 리커런트 뉴럴넷은 앞서 말씀드린 대로 이렇게 전체의 구조를 가지고 말씀드리면 너무 복잡해지니까 이걸 좀 간단하게 표현하도록 할게요. 첫 번째는, 리커런트 뉴럴넷의 이 x를, 이 벡터를 다 묶어 버리겠습니다. 그래서 이걸 xt라고 부르고요, 여기는 h들을, 벡터를 다 하나로 묶어서 ht, 아웃풋을 다 묶어서 ot라고 하겠습니다. 그리고 사실 저는 이걸 c라고 했지만, c에는 어떤 값이 저장되죠? ht라는 건 t번째 데이터에 대한 출력을 의미해요. 바로 전 것이니까 이건 우리가 ht-1이라고 할 수 있겠죠? 그래서 이 벡터 노테이션을 이용해서 이 그림을 이렇게 표현할게요. x를 ht, x, ht, ot, ht-1. 이렇게 하겠습니다. 그래서 여러분이 이걸 보시면서, 아, 스칼라구나, 스칼라구나, 스칼라구나, 라고 생각하시면 안 됩니다. 이걸 보시면 이건 뭐죠? 벡터예요. xt는 벡터라고 했죠? ht는 뭐라고 했죠? 이것도 벡터입니다. ht-1도 당연히 벡터가 되겠죠? 벡터니까 다 이렇게 이렇게... 다 벡터예요. 그다음에 o도 다 벡터입니다. 다 벡터예요, 이렇게. 얘도 벡터고요. 이 화살표가 있다고 해서 '아, 화살표!' 아니죠? 이 화살표의 의미는 뭐죠? 네. 뉴럴 네트워크 커넥션. 입력 웨이트 입력 웨이트 입력 커넥션. 어떤 거죠? 풀리 커넥티드된, 얘는 이쪽으로, 얘는 이쪽으로... 풀리 커넥티드되어 있고요. 이 작대기도 이렇게 해서 이렇게 이렇게... 풀리 커넥티드. 좀 정신이 없네요. 그다음에 여기도 이렇게, 이렇게, 이렇게. 풀리 커넥티드된다. 꼭 기억하세요. 여기에 x, h, o, ht-1이 스칼라가 아니고 다 벡터다. 그다음에 이 화살표가 그냥 화살표가 아니고, x와 h 사이의 완전 풀리 커넥티드 뉴럴넷. 뉴럴넷 구조다. 다 뉴럴넷, 뉴럴넷, 뉴럴넷 구조라는 것을 꼭 기억하시기 바랍니다. 자, 이것이 다 뉴럴넷 구조니까, 보시다시피 다 커넥션 웨이트가 있어야 되겠죠? 그래서 여기는 w, u, v라고 말하고. 그다음은 뉴럴넷이니까 똑같습니다. h는 어떻게 될까요? h의 입력은 ht-1과 xt-1이니까, 입력, 웨이트, 입력, 웨이트, 써메이션, 액티베이션이 되겠죠. 여기서 입력, 웨이트, 입력, 웨이트, 입력, 웨이트, 써메이션, 액티베이션. 물론 여기가 벡터라고 했습니다만, 벡터지만 똑같습니다. 어차피 리니어한 수식이라, 이건 벡터 노테이션이에요. '어, 저거 스칼라처럼 쓰셨네요?' 아니요, 벡터 노테이션이에요. 벡터 곱셈, 벡터 곱셈이에요. 그런데 우리는 입력, 웨이트, 입력, 웨이트... 그렇게 생각해도 딱 표현은 맞습니다. 자 그래서 여기 입력, 웨이트, 입력, 웨이트, 써메이션, 액티베이션 했고요, 그다음에... 똑같죠? 입력, 웨이트, 액티베이션이죠? 입력, 웨이트, 액티베이션해서 o가 나오는 뉴럴넷 구조가 되겠습니다. 이렇게 뉴럴넷 구조가 만들어졌고요, 이렇게 만들어진 뉴럴넷에 대해 실제로 해보도록 하죠. 만약 첫 번째 트레이닝 데이터가 들어오면 어떻게 될까요? 이 구조가 이제부터 계속 반복 사용되는 겁니다. 이게 뉴럴넷 하나예요, 사실은. 뉴럴넷 딱 하나가 있고요. 첫 번째 트레이닝 데이터가 들어오면 트레이닝 데이터를 딱 걸고 이렇게 가면 되겠죠? 그런데 여기를 보면, 지금은 첫 번째는 h가 있어요, 없어요? 없잖아요. 사실은 여기에 이렇게 있어야 되는데, 여기에 예를 들면 여러분이 0값을 주면 되는 거죠. 없으니까. 이니셜 0 값을 주면 이렇게 해서 이 구조가 첫 번째 트레이닝 데이터에 사용되겠죠. 그래서 이 h1이라는 값은 저장이 되겠죠. 일단 첫 번째 데이터가 들어가면 팅 하고 빠져나가면서 h 값은 저장이 되고, 그 저장된 값이 이제 두 번째 트레이닝 데이터가 들어오면 어떻게 되죠? 이게 두 번째 트레이닝 데이터죠? 두 번째 트레이닝 데이터가 들어오면 아까 저장되었던 h 값이 이렇게 해서, 바로 이 구조가 한 번 또 여기에서 사용되죠? 그리고서는, 메모리에 h2가 저장돼요. h2가 저장되었다가 세 번째 트레이닝 데이터가 들어오면, 여기에서 세 번째 트레이닝 데이터가 들어오면 다시 이렇게 해서 세 번째 트레이닝 데이터 값을 계산합니다. 지금 잘 보시면 여기에 계속 반복 사용되고 있는 거예요. 당연한 얘기입니다. 첫 번째 트레이닝 데이터, 두 번째 트레이닝 데이터, 세 번째 트레이닝 데이터... 그 다음에 여기에 반복 사용되는 것은 당연하죠? 네 번째, 다섯 번째 트레이닝 데이터가 계속 반복 사용되어서 쭉 계산됩니다. 첫 번째 트레이닝 데이터가 들어올 때는 o1, 두 번째 트레이닝 데이터가 들어오면 다시 이 구조에다 두 번째 트레이닝 데이터를 넣어서 계산. 세 번째 트레이닝 데이터가 들어오면 다시 여기에 세 번째 트레이닝 데이터를 넣어서 계산. 네 번째 트레이닝 데이터가 들어오면 다시 계산. 다섯 번째가 들어오면 다시 넣어서 계산해서, 계속 반복해서 계산, 계산, 계산해서 나가는 거죠. 그래서, 이 진행되었던 것을 다 쭉 연결해볼까요? 그러면 이렇게 표현이 돼요. 첫 번째 트레이닝 데이터, 두 번째, 세 번째, 네 번째, 다섯 번째 트레이닝 데이터가 들어오고. 쭉 계산이 되는데, 이게 계속 이 구조가 반복 사용되는 거죠. 이렇게 해서 다섯 번째 트레이닝 데이터. 네 번째는 다시 이렇게 해서 네 번째 트레이닝 데이터. 이렇게 해서 세 번째 트레이닝 데이터. 이렇게 해서 두 번째 트레이닝 데이터. 이렇게 해서 없습니다만, 첫 번째 트레이닝 데이터. 이렇게 똑같이 생긴 것이 첫 번째 트레이닝 데이터, 두 번째 트레이닝 데이터, 세 번째 트레이닝 데이터, 네 번째 트레이닝 데이터, 다섯 번째, 여섯 번째, 일곱 번째... 계속 반복되면서 죽 죽 죽 치고 나가요. 그런데 결국 얘들이 어떻게 되냐면, 꼬리에 꼬리를 무는 구조가 되죠? 보통 우리가 보통 우리가 CNN, RNN을 사용하면 이 링크가 없어요. 그렇죠? 첫 번째 트레이닝 데이터는, 그냥 첫 번째 트레이닝 데이터 계산하고 끝. 그렇죠? 두 번째 트레이닝 데이터가 들어오면 어떻게 되죠? 그냥 똑같이 이 뉴럴넷 계산하고 끝. 세 번째 트레이닝 데이터가 들어오면 이것 계산하고 끝. 네 번째 트레이닝 데이터가 들어오면 이것 계산하고 끝. 이렇게 해서 첫 번째 트레이닝 데이터, 두 번째 트레이닝 데이터, 세 번째 트레이닝 데이터, 네 번째 트레이닝 데이터가 다 독립으로 다 따로 계산됩니다. 그런데 리커런트 뉴럴넷은 그렇지 않아요. 첫 번째 트레이닝 데이터의 결과가 두 번째로 넘어가고, 두 번째 트레이닝 데이터의 결과가 세 번째로 넘어가고, 세 번째 트레이닝 데이터가 네 번째로 넘어가서, 꼬리에 꼬리를 무는 구조가 되어서, 마치 거대한 하나의 뉴럴 네트워크가 되는 거예요. 그러니까 무슨 말이냐? 여기 다 뭐가 되는 거죠? 여기 다 레이어가 있다고 했죠? 레이어, 레이어, 레이어가 다 뉴럴 네트워크죠? 레이어가 있고요. 그다음에 여기 x가 이쪽으로 이렇게 해서 풀리 커넥티드되어 있고, 그다음에 여기 어떻게 되죠? 이렇게 해서 풀리 커넥티드, 여기도 이렇게 해서 풀리 커넥티드, 풀리 커넥티드, 풀리 커넥티드, 이렇게 풀리 커넥티드, 여기서 풀리 커넥티드, 출력이 돼요. 그러니까 x1과 o만 보면, 입력이 들어가서 히든 레이어, 히든 레이어, 히든 레이어, 출력하는 구조가 되어버린 거네요. 어? 이게 뭔일?! 다시 말씀드리면 x1, y1, 그다음에 x2, y2. 그다음에 x3, y3. 다섯 개 해야 되는데 여기까지만 쓸게요. 첫 번째 두 번째 세 번째 트레이닝 데이터가 주어졌는데, 이걸 이렇게 해석하니까 세 개의 트레이닝 데이터가 아니라 마치 뭘로 이해하면 되죠? 입력이 몇 개? 입력이 세 개고, 입력 x1, x2, x3. 출력이 y1, y2, y3가 되는, 하나의 트레이닝 데이터처럼 해석을 할 수도 있어요. 그러니까 트레이닝 데이터가 이 세 개가 이 개별 구조에 들어간 게 아니고, 이렇게 쭉. 여기는 다섯 개죠. 입력이 몇 개? 여기서부터 여기까지 입력이 다섯 개고, 출력이 다섯 개가 한 개로 뭉친. 다시 말씀드리면 이건 마치 어떻게 된 거냐면 x1, x2, 다 쓰죠. x3, x4, x5. 이건 다 벡터 벡터 벡터니까 벡터를 concatenate한 겁니다. 이게 입력이 되고, y1, y2, y3, y4, y5 해가지고, 이렇게 거대한 트레이닝 데이터 하나가 거대한 뉴럴넷 하나에 들어가는 느낌이 난단 말이에요. 자, 그리고 이 뉴럴넷을 잘 보시면 어떻게 되냐면, 여기 커넥션 웨이트가 어떻게 되죠? 여기는 w. w, w, 왜? 계속 반복 사용되고 있으니까, w, w가 되고요. 그다음 출력은 v, v, v, v, v가 되고요. 여기는 입력이 u, u, u, u, u. 이렇게 생긴 거대한 뉴럴넷으로 이해할 수 있어요. 그러니까, 리커런트 뉴럴넷은 기본 컴포넌트가 계속 반복 사용됨으로써, 이 구조죠? 이 컴포넌트가 계속 반복 사용됨으로써 시간이 흘러갈수록 점점 레이어가 쌓여 가는 구조. 그래서 사실 트레이닝 데이터가 첫 번째, 두 번째, 세 번째,... 일곱 번째라고 했지만, 그냥 이 상태로만 보면 그냥 트레이닝 데이터 하나. 이렇게 엄청나게 긴 입력을 받아서, 이렇게 엄청나게 긴 출력을 출력하는 거대한 뉴럴넷 하나로 이해할 수 있다. 그다음에 기본 컴포넌트가 계속 반복되면서 레이어마다, 레이어와 레이어 사이의 커넥션 웨이트, 레이어와 레이어 사이의 커넥션 웨이트, 레이어와 레이어 사이의 커넥션 웨이트가 다 공유되고, 입력이 들어오는 곳은 다 커넥션 웨이트가 공유되고, 출력도 다 공유되는 구조라고 이해할 수 있어요. 구조가 똑같지는 않지만, 느낌이 뭐랑 똑같죠? CNN. CNN에 나온 말이랑 똑같잖아요. CNN도 그죠? 똑같은 것이 반복 사용된다. 물론 반복 사용되는 것이 다르고, 어떻게 반복 사용되느냐가 달라요. 그렇지만 CNN에서 말했던 것과 거의 유사한 말들이 나오잖아요? 반복 사용된다. 그렇죠? 반복 사용되고 있어요. 그래서 결국 시퀀셜 데이터를 처리하는 구조가 이 리커런트 뉴럴 네트워크가 시퀀셜 데이터 처리에 적합하다고 사람들이 생각하고 쓰고 있습니다. 물론, 여러분이 오해하시면 안 될 게, 시퀀셜 데이터 처리를 하기 위해서 이 구조가 유일하고 이것이 시퀀셜 데이터 처리의 최고 구조고, 그래서 사람들이 이걸 쓴다고 오해하시면 안 되고요. 아직, 시퀀셜 데이터를 처리할 수 있는 구조는 굉장히 많겠죠. 굉장히 많은데, 사람들이 지금까지 생각해낸 게, 이런 구조가 그나마 제일 구조였고 이걸로 시퀀셜 데이터를 처리해보니, '생각보다 잘되네?' 뭐, 그렇게 해서, 이 시퀀셜 데이터 처리를 위해 사람들이 이걸 사용한다, 이렇게 생각하시는 게 좋을 것 같습니다. 왜냐하면 뉴럴넷 구조는 수학적으로 증명되거나, 옵티멀하다거나 그렇게 증명된 것은 없어요. 그냥 사람들이 머릿속에서 '음... 이렇게 해볼까, 저렇게 해볼까 하다가, 어, 이거 되네? 야 된다.' 하고서 '이거 되니까 너도 한번 써봐.' '어? 나도 돼.' 뭐 이러면서 널리 퍼지면서 사람들이 쓰기 시작한 거지, 결코 이게 무슨 수학적 증명이라든지 수학적으로 그럴 수밖에 없다든지 그런 걸로 개발되지는 않았습니다. 그래서 이 구조가 그냥 '음, 뭐 시퀀셜 데이터를 처리할 수 있겠네. 근데 해보니까 잘돼.' '어, 그래? 그럼 나도 한번 써봐야지.' 하는 수준에서 퍼진 거다, 라고 생각하시면 되겠습니다. 그래서 이 시간에는 리커런트 뉴럴넷에 대해 말씀을 드렸고요. 리커런트 뉴럴넷은 시퀀셜 데이터 모델링에 많이 사용되고, 그다음에 이건 결국 풀리 커넥티드 뉴럴넷의 어떤 특별한 스페셜 타입 중 하나라고 보시면 되겠습니다. 그다음에 모든 커넥션 웨이트, 특히 레이어와 레이어 사이에 존재하는 커넥션 웨이트가 모든 레이어에서 공유되는 특별한 구조다, 라는 걸 기억하시면 되겠습니다. [음악]