안녕하세요! 영상을 보며 공부하는 중에 궁금한 점이 있어서 질문드립니다! 영상 속 08:06 구간에서 ResNet에서 변화하 X를 모두 학습하기 보다 X의 변화량만 학습하는 것이 더 좋고, 또 그렇게 하기 위해 H(x) = F(x) + x 를 유도한 것은 이해가 가지만, F(x)를 구하기 위해서 Conv 레이어를 통과한 결과에 input X를 더하는 것이 이해가 가지 않습니다. 더하게 되면 결국 H(x) + X를 하는 것이 아닌가요? 제 막연한 생각으로는 편차(Residual)을 구하려면 X - F(x) 혹은 F(x) - X 해야 할 것 같은 데 말이죠 ㅎㅎ;;; 왜 conv레이어를 통과한 x에 처음에 input으로 들어온 x를 더하는데 편차를 학습하게 되는 지 궁금합니다!
좋은 질문 감사합니다. 충분히 수식이 헷갈릴 수 있는데요. 두 번째 Conv 레이어를 통과한 결과까지를 F(x)로 봅니다. 따라서 여기에 identity mapping을 더하므로 말씀하신 H(x) + x가 아니라, F(x) + x가 됩니다. 이상적인 mapping을 H(x)라고 했을 때, F(x) + x가 H(x)를 더 잘 근사하게 된다는 의미로 보시면 됩니다. 다음 슬라이드에 나오는 수식에서도 상세히 드러나 있습니다.
@@dongbinna 음........ 기존의 방식대로 학습할때는 각 레이어 별로 x에 더해진 가중치(w)를 쫓아 올라가지만, 우측 그림 'F(x) + x' 의 경우 결과적으로 x에 f(x)만을 더한 셈이니 f(x)를 쫓아 올라간다는 것으로 보면 되는 것인가요...? 뭔가 알쏭달쏭하네요...
@@차시헌-b1v 제가 이해한 내용으로는 ResNet에서 H(x)는 Plane layer에서 input X를 target Y로 mapping(underlying function) 하는 H(x)와 다르다는 것입니다. 차시헌님의 원 댓글을 보면 Plane에서의 H(x)와 ResNet에서 H(x)를 동일하게 보고 있는 거 같은데 두 H(x)는 network(or block)의 최종 결과를 의미하는 것이지 실제로 같은 것이 아닙니다. 또한, 본 영상 논문의 저자들이 쓴 후속 논문 "Identity Mappings in Deep Residual Networks"을 보면 ResNet에서 H(x)는 identity mapping function으로 가정하고 있습니다. 결국 F(x) = H(x) - x 에서 F(x)를 residual로 부르는 이유는 H(x)가 identity mapping으로 가정하고 있기 때문에 H(x)-x가 잔차(residual)이 되는 것이죠. 자세한 내용은 후속 논문을 읽어보시거나 해당 논문의 review를 참고하시면 좋을 거 같습니다.
46:34 에서 shortcut 정의할 때 nn.Conv2d(in_planes, planes, kernel_size=1, stride=stride, bias=False), 와 같이 padding 추가하는 부분이 빠져있는데요. 그렇게 되면 out이랑 shortcut이 size가 달라지게 되지 않나요?
@동빈나 질문있습니다! 너무 허접한 질문이 아닐까 생각이 드는데요 ㅠㅠ 24:30 에서 outputsize 가 레이어를 거칠수록 줄어드는데 코드를 보면 어느 부분에서 outputsize가 줄어드는지 잘 모르겠습니다. 코드를 보면 convolution layer를 거칠 때 padding이 되어 있고 그렇다고 이후에 풀링층도 없어서 제 생각엔 outputsize가 줄어들 것 같지 않을 것 같거든요... 제 이해가 어느부분이 잘 못 되었는지 알려주시면 정말 감사하겠습니다!
output size가 줄어드는 것은 stride를 1보다 큰 값으로 주면 size가 줄어들게 됩니다. 3x3 filter에 stride와 padding을 1로 하면 same padding이 되어 크기가 줄어들지 않지만 3x3 filter에 padding=1, stride=2로 하면 output size가 절반이 됩니다.
명강의 감사합니다 나동빈님!! 저도 밑에 있는 분과 비슷한 것이 궁금해 댓글 남깁니다. PLAIN에서 X가 2개의 layer를 거쳐 나온 결과물을 H(x)라고 이해했습니다. residual block에서도 input x가 두개의 layer를 거친 결과물을 f(x) 라고 하는 거 같은데 그렇게 되면 plain에서의 h(x)와 residual에서의 f(x)가 같아지는 것 아닌가요...? 왜 x+ f(x) 가 h(x)와 같아지는 것인지 이해가 잘안갑니다..
제가 이해한 것에 따르면 plane에서 H(x)와 ResNet에서 H(x)는 같은 값이 아닙니다. H(x) 라는 표현은 Network의 output으로 이해를 해야 합니다. plane에서 H(x)는 network(or block)의 output이므로 두 개의 weight layer를 통과한 값으로 보는 것이고 ResNet에서 H(x)는 두 개의 weight layer를 통과하는 F(X,W)와 shortcut X의 합이 H(x)가 되는 것입니다.
너무 잘 들었습니다 동빈님 한 가지 질문이 있습니다. ruclips.net/video/671BsKl8d0E/видео.html 에서 shortcut을 이용해 입력 값 또는 앞서 학습해서 나온 output을 추가해줌으로써 H(x)보다 수렴 난이도를 줄이는 것은 잘 이해가 됩니다. 그리하여 F(x)+x가 나왔습니다. 하지만 궁금한 것은 F(x)는 input으로 X를 받고 weight layer에서 convolution 연사 후 relu function을 사용하고 바로 weight layer를 하나 붙여준 것 뿐인데 어째서 F(x)가 H(x)-x 인지 잘 이해가 되지 않습니다. 혹시 답변 해주실 수 있나요? *알고계신분이라면 아무나 댓글 부탁드립니다.
ResNet의 최종 결과를 H(x)라고 하면 H(x) = F(x) + x 가 되죠? 이 식에서 이항을 통해 F(x) = H(x) - x가 나오게 됩니다. Plane에서 H(x)는 두 개의 weight layer를 통과한 결과이고 ResNet에서의 H(x)는 역시 최종 결과로서 앞서 말한 거와 같이 F(x)와 x를 더한 값이 됩니다. H(x)를 최종 출력 결과를 나타내는 표현으로 이해하시면 좋을 거 같네요.
둘 다 해주는 경우가 많으며, ResNet 또한 그런 방식을 따르고 있습니다. 입력단에서의 Input Normalization뿐만 아니라 파라미터의 Batch Normalization까지 수행하면 네트워크의 수렴 속도가 안정성이 더 향상되는 편입니다. 또한 Input Normalization에서 사용하는 [0.485, 0.456, 0.406]와 같은 값은, 실제 학습 데이터셋이 가지는 평균값과 표준 편차를 계산하여 찾은 값입니다. 예를 들어 CIFAR-10이나 MNIST 데이터셋에서는 이 값이 다릅니다!
동빈나 선생님, 영상 감사합니다. 영상을 보며 공부하던중 궁금한 점이 있어서 질문드립니다. 영상속에서 말씀하신걸 간추려 표현해 보면 어느정도 이상의 깊이를 가진 network 는 training data에 대해서 performance가 하향하는데 residual block을 이용하여 하향하는것을 prevent하고 더 깊은 network 의 performance를 향상을 기대하는 방법이라고 생각해도 될까요? Residual block이 성능을 향상시키는 직접적인 원인은 아니지만, 하향하는 것을 방지하기때문에 더 많은 layer를 쌓을수 있고 확률적으로 더 높은 성능을 기대한다 라는 표현이 맞는 이해인지 여쭤보고 싶습니다. 감사합니다!
영상 정말 넘 ㅜ감사합니다.... 논문 읽으면서 궁금했던 부분이 있는데 덕분에 해결되었어요!! 초심자에게 도움 되는 영상 너무나도 감사합니다ㅎㅎ
27:09 정말 최고입니다.
이런 좋은글에 조회수가 10만이 안된다는게 아쉽네요.
앙 블루오션 개꿀띠
아는 내용이였지만 설명하시는 내용 보면서 정리 알차게 되네요 ㅎㅎ. 교대 출신이라 그러신지 IT 분야 내용 가르치는 능력은 최고수준 수준이신듯. 나도 랩발표때 이렇게 말 잘하고 싶다 ㅋㅋ ㅠㅠ
densenet도 한번 해주시면 안될까요?? 이렇게 논문까지 보여주면서 집어주니까 너무 고퀄리티네요 제 롤모델입니다 형님 사랑해요
좋은 컨텐츠 감사합니다.
42:18 URL이 없는 URL로 뜨는데 어떻게 진행하면 될까요?ㅠ 실습을 처음 해보는거라 질문드립니다..!
안녕하세요! 영상을 보며 공부하는 중에 궁금한 점이 있어서 질문드립니다! 영상 속 08:06 구간에서 ResNet에서 변화하 X를 모두 학습하기 보다 X의 변화량만 학습하는 것이 더 좋고, 또 그렇게 하기 위해 H(x) = F(x) + x 를 유도한 것은 이해가 가지만, F(x)를 구하기 위해서 Conv 레이어를 통과한 결과에 input X를 더하는 것이 이해가 가지 않습니다. 더하게 되면 결국 H(x) + X를 하는 것이 아닌가요? 제 막연한 생각으로는 편차(Residual)을 구하려면 X - F(x) 혹은 F(x) - X 해야 할 것 같은 데 말이죠 ㅎㅎ;;; 왜 conv레이어를 통과한 x에 처음에 input으로 들어온 x를 더하는데 편차를 학습하게 되는 지 궁금합니다!
좋은 질문 감사합니다. 충분히 수식이 헷갈릴 수 있는데요. 두 번째 Conv 레이어를 통과한 결과까지를 F(x)로 봅니다. 따라서 여기에 identity mapping을 더하므로 말씀하신 H(x) + x가 아니라, F(x) + x가 됩니다. 이상적인 mapping을 H(x)라고 했을 때, F(x) + x가 H(x)를 더 잘 근사하게 된다는 의미로 보시면 됩니다. 다음 슬라이드에 나오는 수식에서도 상세히 드러나 있습니다.
@@dongbinna 음........ 기존의 방식대로 학습할때는 각 레이어 별로 x에 더해진 가중치(w)를 쫓아 올라가지만, 우측 그림 'F(x) + x' 의 경우 결과적으로 x에 f(x)만을 더한 셈이니 f(x)를 쫓아 올라간다는 것으로 보면 되는 것인가요...? 뭔가 알쏭달쏭하네요...
@@차시헌-b1v 제가 이해한 내용으로는 ResNet에서 H(x)는 Plane layer에서 input X를 target Y로 mapping(underlying function) 하는 H(x)와 다르다는 것입니다. 차시헌님의 원 댓글을 보면 Plane에서의 H(x)와 ResNet에서 H(x)를 동일하게 보고 있는 거 같은데 두 H(x)는 network(or block)의 최종 결과를 의미하는 것이지 실제로 같은 것이 아닙니다. 또한, 본 영상 논문의 저자들이 쓴 후속 논문 "Identity Mappings in Deep Residual Networks"을 보면 ResNet에서 H(x)는 identity mapping function으로 가정하고 있습니다. 결국 F(x) = H(x) - x 에서 F(x)를 residual로 부르는 이유는 H(x)가 identity mapping으로 가정하고 있기 때문에 H(x)-x가 잔차(residual)이 되는 것이죠. 자세한 내용은 후속 논문을 읽어보시거나 해당 논문의 review를 참고하시면 좋을 거 같습니다.
동빈님 항상 좋은 영상 감사합니다! 저도 영상처리를 공부하는 중인데 이번 cvpr2020에 나온 pulse 리뷰랑 코드 실습 해주실 수 있으실까요,,,?? 제가 하니까 계속 막혀서 말입니가 ㅠㅠ
오 이 논문 재미있어 보이네요... 추천 감사드려요! 참고하겠습니다 :)
@@dongbinna 감사합니다!! 항상 동빈님 영상보고 공부하고 있습니다! Gan 기반 논문은 항상 어려운것 같더라구여 ㅠㅠ
다운로드 해두고 지하철에서 들으면 좋은 강독!
감사합니다 큰 도움이 되었습니다 :)
딥러닝 독학하다가 CNN에서 막혀서 골머리 앓고 있었는데..너무 좋은 설명 감사드려요!! 쉽게 풀어서 두번씩 반복 설명해주시는 게 도움이 많이 됩니다. _make_layer 정의에서 stride부분만 아직 해결이 안되어서..ㅜㅜ설명해주신 논문을 정독해봐야겠어요!
46:34 에서 shortcut 정의할 때
nn.Conv2d(in_planes, planes, kernel_size=1, stride=stride, bias=False),
와 같이 padding 추가하는 부분이 빠져있는데요.
그렇게 되면 out이랑 shortcut이 size가 달라지게 되지 않나요?
@동빈나 질문있습니다! 너무 허접한 질문이 아닐까 생각이 드는데요 ㅠㅠ 24:30 에서 outputsize 가 레이어를 거칠수록 줄어드는데 코드를 보면 어느 부분에서 outputsize가 줄어드는지 잘 모르겠습니다. 코드를 보면 convolution layer를 거칠 때 padding이 되어 있고 그렇다고 이후에 풀링층도 없어서 제 생각엔 outputsize가 줄어들 것 같지 않을 것 같거든요... 제 이해가 어느부분이 잘 못 되었는지 알려주시면 정말 감사하겠습니다!
output size가 줄어드는 것은 stride를 1보다 큰 값으로 주면 size가 줄어들게 됩니다. 3x3 filter에 stride와 padding을 1로 하면 same padding이 되어 크기가 줄어들지 않지만 3x3 filter에 padding=1, stride=2로 하면 output size가 절반이 됩니다.
명강의 감사합니다 나동빈님!!
저도 밑에 있는 분과 비슷한 것이 궁금해 댓글 남깁니다.
PLAIN에서 X가 2개의 layer를 거쳐 나온 결과물을 H(x)라고 이해했습니다.
residual block에서도 input x가 두개의 layer를 거친 결과물을 f(x) 라고 하는 거 같은데
그렇게 되면 plain에서의 h(x)와 residual에서의 f(x)가 같아지는 것 아닌가요...?
왜 x+ f(x) 가 h(x)와 같아지는 것인지 이해가 잘안갑니다..
제가 이해한 것에 따르면 plane에서 H(x)와 ResNet에서 H(x)는 같은 값이 아닙니다. H(x) 라는 표현은 Network의 output으로 이해를 해야 합니다. plane에서 H(x)는 network(or block)의 output이므로 두 개의 weight layer를 통과한 값으로 보는 것이고 ResNet에서 H(x)는 두 개의 weight layer를 통과하는 F(X,W)와 shortcut X의 합이 H(x)가 되는 것입니다.
목소리가 너무 좋네요..
논문을 읽는 방법이 따로 있을까요?
한번 쭉 살펴보시고 설명 해 주실 때 간추리신건가요?
Resnet18 모델인데 실제로는 layer개수가 19개인거 같은데 maxpool은 layer로 안세는건가요?
입력, 풀링은 파라미터의 개수가 0개입니다. 반면에 컨볼루션이나 Fully Connected는 파라미터의 개수가 존재합니다. 통상적으로 레이어의 길이란 파라미터가 존재하는 가중치(weight) 레이어의 개수를 말합니다.
너무 잘 들었습니다 동빈님
한 가지 질문이 있습니다. ruclips.net/video/671BsKl8d0E/видео.html 에서 shortcut을 이용해 입력 값 또는 앞서 학습해서 나온 output을 추가해줌으로써 H(x)보다 수렴 난이도를 줄이는 것은 잘 이해가 됩니다. 그리하여 F(x)+x가 나왔습니다. 하지만 궁금한 것은 F(x)는 input으로 X를 받고 weight layer에서 convolution 연사 후 relu function을 사용하고 바로 weight layer를 하나 붙여준 것 뿐인데 어째서 F(x)가 H(x)-x 인지 잘 이해가 되지 않습니다. 혹시 답변 해주실 수 있나요?
*알고계신분이라면 아무나 댓글 부탁드립니다.
ResNet의 최종 결과를 H(x)라고 하면 H(x) = F(x) + x 가 되죠? 이 식에서 이항을 통해 F(x) = H(x) - x가 나오게 됩니다. Plane에서 H(x)는 두 개의 weight layer를 통과한 결과이고 ResNet에서의 H(x)는 역시 최종 결과로서 앞서 말한 거와 같이 F(x)와 x를 더한 값이 됩니다. H(x)를 최종 출력 결과를 나타내는 표현으로 이해하시면 좋을 거 같네요.
동빈님 질문 있습니다! 뉴럴넷에서 batchNorm을 하는데도 input을 Normalize를 따로 또 해줘야 하나요? 또, input Normalize 에 사용되는 mu = 0.456, std= 0.229 이런 값들은 어디서 오는 것일까요?
둘 다 해주는 경우가 많으며, ResNet 또한 그런 방식을 따르고 있습니다.
입력단에서의 Input Normalization뿐만 아니라 파라미터의 Batch Normalization까지 수행하면 네트워크의 수렴 속도가 안정성이 더 향상되는 편입니다. 또한 Input Normalization에서 사용하는 [0.485, 0.456, 0.406]와 같은 값은, 실제 학습 데이터셋이 가지는 평균값과 표준 편차를 계산하여 찾은 값입니다. 예를 들어 CIFAR-10이나 MNIST 데이터셋에서는 이 값이 다릅니다!
error rate 그래프에서 반복 횟수가 15000 회일 때랑 30000회 일 때 error rate이 급격하게 떨어지는데 이건 왜 그런 건가요?
대학원생입니다. 감사합니다.
동빈나 선생님, 영상 감사합니다. 영상을 보며 공부하던중 궁금한 점이 있어서 질문드립니다. 영상속에서 말씀하신걸 간추려 표현해 보면 어느정도 이상의 깊이를 가진 network 는 training data에 대해서 performance가 하향하는데 residual block을 이용하여 하향하는것을 prevent하고 더 깊은 network 의 performance를 향상을 기대하는 방법이라고 생각해도 될까요?
Residual block이 성능을 향상시키는 직접적인 원인은 아니지만, 하향하는 것을 방지하기때문에 더 많은 layer를 쌓을수 있고 확률적으로 더 높은 성능을 기대한다
라는 표현이 맞는 이해인지 여쭤보고 싶습니다. 감사합니다!
레지듀얼 매핑이란 H는 마련하기 어려우니깐 F로 대체해서 x를 더해줬을 뿌ㄴ.. 아 그렇구나..
정말 그것만 바꿔주었는데도 성능이 엄청 올라갔다는 놀라운 사실...!!!
안녕하세요 혹시 처음 코딩 배울려고하는데 c언어를 먼저해야하나여 아니면 파이썬 먼저 해야하나여..?
둘다 좋은 언어인것 같습니다.
다만 난이도나 취업용 코테공부같은걸 할때는 파이썬이 더 편하다고 하네요
감사합니다 동빈센세 머리 터질뻔했는데
24:30 ~ 왜 residual 학습이 direct학습보다 쉬운가
아하 그러니까 ResNet18 과 CIFAR-10 이군요!
굿 감사용
13:33
안녕하세요 저는 파이썬을 배우고 있는 고2 학생 입니다. 혹시 주말이나 평일에 1시간에서 2시간정도 문자로 코딩 수업좀 봐주시면 안될까요?