nugu candle의 하드웨어 스펙이다.


 

모델명

비고 

 ap

Samsung Exynos 7570


 ram

Spectek SS256M32V01MD1LPF-107BT PB047

 

 nand

Samsung KLM4G1FETE-B041(eMMC5.1 32Gb based)1.0

 

 rom

Winbond 25q16fw 

uboot ?


분석에 앞서 펌웨어 취득을 위해 adb 및 root permission이 enabled된 recovery image를 fastboot로 live upload하려 했지만...

zimage magic error로 aarch64, arm, armhf 이미지 모두 업로드 실패하고 뱉어서 포기했다.


AI스피커 대상 UART 포트가 대부분 살아 있는 특징을 이용해보았다.

기가지니나 누구는 외형으로 드러나 있고 클로바와 카카오는 네이밍이 따로 되어있지 않아 찾아야 한다ㅜㅜ


uboot의 mmc 명령어를 활용하면 파티션 테이블을 활용한 파티션 레이아웃을 얻을 수 있다.


---

ESPRESSO7570 # mmc part


Partition Map for MMC device 0  --   Partition Type: EFI


Part    Start LBA       End LBA         Partition_Size(MB)      Name

        Attributes

        Type GUID

        Partition GUID


  1     0x              22      0x           32021      100     "fat"

        attrs:  0x0000000000000000

        type:   ebd0a0a2-b9e5-4433-87c0-68b6b72699c7

        guid:   a2a0d0eb-e5b9-3344-87c0-68b6b72699c7

  2     0x           32022      0x          226021      1000    "system"

        attrs:  0x0000000000000000

        type:   ebd0a0a2-b9e5-4433-87c0-68b6b72699c7

        guid:   af3dc60f-8384-7247-8e79-3d69d8477de4

  3     0x          226022      0x          514001      1501    "userdata"

        attrs:  0x0000000000000000

        type:   ebd0a0a2-b9e5-4433-87c0-68b6b72699c7

        guid:   af3dc60f-8384-7247-8e79-3d69d8477de4

  4     0x          514022      0x          640021      600     "cache"

        attrs:  0x0000000000000000

        type:   ebd0a0a2-b9e5-4433-87c0-68b6b72699c7

        guid:   af3dc60f-8384-7247-8e79-3d69d8477de4

  5     0x          640022      0x          672021      100     "modem"

        attrs:  0x0000000000000000

        type:   ebd0a0a2-b9e5-4433-87c0-68b6b72699c7

        guid:   af3dc60f-8384-7247-8e79-3d69d8477de4

  6     0x          672022      0x          67c021      20      "efs"

        attrs:  0x0000000000000000

        type:   ebd0a0a2-b9e5-4433-87c0-68b6b72699c7

        guid:   af3dc60f-8384-7247-8e79-3d69d8477de4

  7     0x          67c022      0x          6ae021      100     "recovery"

        attrs:  0x0000000000000000

        type:   ebd0a0a2-b9e5-4433-87c0-68b6b72699c7

        guid:   af3dc60f-8384-7247-8e79-3d69d8477de4

  8     0x          6ae022      0x          6e0021      100     "misc"

        attrs:  0x0000000000000000

        type:   ebd0a0a2-b9e5-4433-87c0-68b6b72699c7

        guid:   af3dc60f-8384-7247-8e79-3d69d8477de4


Total partition size     : 3729 MB

Available capacity       : 208 MB


숨겨진 파티션의 경우 이미지 자체에 하드코딩 되어 있어서 펌웨어를 뜯기 전에는 모른다.

uboot에서 fastboot 돌리면 파티션정보가 주르륵 튀어나오긴 한다. 오프셋이 없어서 그렇지ㅜㅜ


펌웨어 취득은 uboot의 mmc dump x y를 통해서 진행할 수 있는데 uart로 4gb 뽑아 내는 데에 상당한 시간이 소요된다 ㅜㅜ

115200baud인데도 start/stop비트 + ascii 전달 + space 값 + offset 필드 때문에 실질적으로 4kbps정도밖에 안나오기 때문이다.

도구 만들어서 뽑았다. FTDI로 넉넉잡아 21일 정도 걸렸던걸로...


---

기기가 한대 더 생겨서...



신기하게 이 친구는 실드가 따로 없다. 보통은 차폐랑 열때문에 실드가 있던데 말이다.

chip-off하면 붙히기 어려울수 있으니 어찌저찌 와이어링 해보고 싶었으나... 실패해서 그냥 chip-off로 이미지 획득했다.

crc 떠보니 uart를 통한 dump값은 서로 동일하다.



GUID partition table에 기술된 파티션 목록이다.

일반적인 android 파티션과 동일하다.


self-signed ca 넣어서 덮어봤는데 자꾸 벽돌이 되길래...

순정 이미지를 fastboot로 밀어넣어도 벽돌이 되는 기이한 현상을 보았다 ㅜㅜ


벽돌은 아예 안켜지는게 아니라 bootup은 되는데 shell에서 hang이 걸리는 현상이다. (surfaceflinger segfault)

logcat이랑 dmesg찍어보니 system파티션 라이브러리에서 심볼을 못찾는다고 한다.

근데 심지어 찾는 심볼이 있는 파일은 문제가 없는 기기에도 없다 (?!)

* 이때 첨 알았는데 요 제품은 root permission이 기본이다.

nu110****이라고 디바이스 컨트롤(fastboot bootup, led 제어 등)하는 바이너리가 있는데 요놈이 루트를 요구한다 ㅡ.ㅡ


그래서 아예 새제품 뜯어서 바로 chip-off하고 죽은 기기 낸드에 펌웨어 덮어씌우고 rework해보았는데 잘 된다.

뭔가 exynos7570에 탑재된 fastboot가 내가 아는 fastboot가 아닌거 같다고 할 정도로ㅜㅜ

fastboot 켜고 erase -> flash 도 해보고 format -> flash 도 해보았지만 음.. 여전히 똑같은 결과...


시간이 없어서 chip-off하고 데이터 넣은 담에 볼납가지고 rework 했다.


CA injection하고 떠보니 네이버 클로바 인젝션 할 때와 똑같은 현상이다.

certification pinning 때문에 ssl encryption된게 보이지 않는 모양이다.


롬을 뜯어보고 싶긴 한데 요놈 분석은 이정도로 마무리지으려 한다. 머리가 아파오는 기기야...


작업용 컴퓨터를 맞추기 위해 CPU를 뽑았는데 나름 수율이 괜찮은게 걸렸다.

클럭 4400MHz CL17 램 오버클럭 뒤 CPU 전압 1.275V에 50배수 45캐시 LinX 0.9.3 벤치마크가 돌아가는 제품이었던 것..


그런데 EVGA CLC280 쿨러로는 너모나 뜨거운 9900K의 발열을 감당할 수 없었던 것이 화두...

갬성의 50배수를 박아서 써보겠다는 강력한 의지...!!! (누가 말렸어야...ㅜㅜ)



정신을 차려보니 부품이 전부 다 도착했다. (지갑이 웁니다 엉엉ㅜㅜ)

사실 제일 문제는 포세이돈이었다... 외장라디에이터를 1차 예판때 덥썩 구매해버린 찰나, 반 강제로 커스텀 수냉을 한 셈


그래도 수냉 한 김에 싹다 수냉을 하자는 마인드로... CPU 수냉, 그래픽카드 수냉, 램도 수냉블럭 씌워버렸다.

호스는 EK에서 나온 ZMT 호스를 사용했는데, 중국산 호스 커터로 잘라도 커팅 잘 된다.


근데 ZMT 호스에 바로우에서 나온 컴프레션 피팅을 체결할 때 너무 힘들었다ㅠ 손가락의 지문이 다 사라질 정도...

그래서 보면 덜조인게 은근 많이 보인다.



이렇게 1차 수냉시스템을 완성했다.


CPU블럭 - RAM블럭 간에 단차가 안맞아서 270도 빙 돌려버려서 너무 안이뻤다....ㅜㅜ

그래서... 다시 계획해서 도전!!



이번에는 직각으로 잘 뽑아서 이쁘긴 한데.. 흠 뭔가 맘에 안든다...

여전히 270도를 돌려버리니 유량감소가 있는건 여전해서... 30mm 연장피팅을 구매해서 다시 작업해보았다.



짜잔.. 드디어 최종적으로 깔끔한 시스템 완성!!



외장 라디에이터와 본체의 이동을 위해 본체 부분에 QDC (Quick-disconnect Connector)를 장착해주었다.



눈물의 수건신공... 혹시 누수되면 그래픽카드가 저세상에 가버리는 부분이니까ㅎㅎ

사진은 누수테스트를 하지 않고 컴퓨터를 켠 상태여서 수건을 받쳐놓았다.

누수테스트는 펌프에 파워만 따로 인가하고 진행하는 것을 추천. 현재는 수건을 치운 상태이다!!


이 과정에 조금 안타까운 일이 생겼다. CPU가 죽어버렸고... 고이 묻어주면서 새 친구를 입양했다.



9세대 CPU 뚜따 및 코어갈이는 신중히 하자...


기존 일체형 수냉이나 공랭의 경우에는 열이 케이스에서 방출되는 구조라서 쉽게 냉각되기 어려운데,

외장 라디에이터를 달아버리니 온도가 쉽게쉽게 내려간다.



그래서 최종적으로 커스텀 수냉으로 얻은것은.. 갬성의 51배수!!



CPU오버클럭이 끝난 후 그래픽카드 오버도 진행해보았다.

5700XT 레퍼런스가 기본으로는 27.5K정도 나오는데 실사용 가능한 수준에서 안정화를 보니 29.6K가 나온다.

1080TI 급 파스 점수다. 물론 아키텍쳐가 다르다보니 파스 점수 비교는 무의미하지만 말이다.



<54배수 50캐시 AIDA64 메모리 벤치마크 결과>


보너스로 커스텀 수냉 한 겸사겸사 내 CPU 수율이 어느정도 되는지 테스트해보았다.

나름 괜찮은 수율인 것 같아서 기분이 좋다.


이제 컴퓨터는 업그레이드고 뭐고 건들지 않고 5년은 쓸 생각이다...

커스텀 수냉에 최고급 그래픽카드 1대 값이 들어가버렸기 때문이다.


수로만 안터지면 최고의 시스템이지 않을까 싶다. 애정과 시간과 돈을 너무 많이 쏟아버렸기 때문ㅜㅜ


최종 수로 구성 모습이다. (Bitspower 14mm 카본동관 이용)







--- 내용추가: 20/06/12 지스킬 플레어 X 3200 CL14 메모리

--- 내용추가: 20/09/06 지스킬 립죠스 V 4000 CL15 메모리 및 로얄 골드 3200 CL14 메모리



용량이 부족해서, 오버가 덜돼서 계속 주문하다보니 트라이던트 시리즈만 4개째다.


아무튼 램들에 대해 후기를 올려보려고 한다.


1. 티포스 나이트호크 (Team T-Force Night Hawk RGB 3200MHz CL16 8GB x2)

 - 하이닉스 A다이, 최대 3600MHz CL17 CR1 (VCCIO auto / VCCSA auto / DDR 1.35 / 8700K + Z370 Classified K)

솔직히 저 당시 가격 주고사서 하이닉스 다이임에도 불구하고 오버가 나쁘지 않게 들어갔었다.

애초에 CPU 멤컨이나 보드 한계치까지 가질 못하니 오버클럭에 스트레스 안받고 무난한 램이었던 것 같다.


2. 트라이던트Z RGB 3200CL14 (G.SKILL TridentZ RGB 3200MHz CL14 8GB x2)

 - 삼성 B다이, A2 Design 8 Layers

 - 최대 4133MHz CL17 CR2 (VCCIO 1.15 / VCCSA 1.2 / DDR 1.35 / 9900K + Z390 Extreme4)




램 정말 이쁘다. 특히나 저 RGB가 은하마냥 흐르는게 보고있으면 빠져든다.

역시 B다이 램이어서인지 기존 티포스 램에서 느꼈던 오버가 안되는 답답함이 싹 사라졌다.

동시에 4000MHz의 벽까지 뚫은 셈.


그런데 참 신기한것은 타이치보드가 램 고클럭 오버시에 RTL, IOL값이 지맘대로 바뀌어버려서 램타 잘못 건들면 4000이 간헐적으로 부팅되는(간헐적으로 부팅이 안되는게 아니라 간헐적으로 부팅됨) 현상이 생긴다. (ㅡㅡ)

너무 화딱지나서 그냥 3866으로 안정화 봤다.



동시에 레이턴시도 30ns대 진입이 가능했고, 링스도 램타를 바짝 쪼아서인지 지플값 잘 뽑아줬다.



3. 트라이던트Z 검빨 3600CL15 (G.SKILL TridentZ 3600MHz CL15 8GB x2)

 - 삼성 B다이, A2 Design 10 Layers

 - 최대 4200MHz CL17 CR2 (VCCSA 1.2 / VCCIO 1.15 / DDR 1.42 / 8700K + Z390 Taichi)



4. 트라이던트Z 검빨 3200CL15 32GB (G.SKILL TridentZ 3200MHz CL15 16GB x2)

 - 삼성 B다이, A2 Design 10 Layers

 - 최대 3800MHz CL17 CR1 (VCCSA 1.2 / VCCIO 1.2 / DDR 1.4 / 9900K + Z390 Extreme4)


미국 출장 다녀오면서 웨어하우스에서 직접 구매해왔다.

요 부분은 연구실에서 사용하고 있다. 그렇기에 안정화 스샷은 따로 없는 점 ㅜㅜ

3800 CL17의 램타이밍으로 사용중인데, 온도가 꽤 높아서 고클럭으로 잡기 힘들다.

8GB메모리는 8뱅크여서 온도 관리가 쉬운데, 16GB메모리는 16뱅크가 발열 제어가 2배로 힘들다 보면 될 것 같다.


5. 트라이던트Z 로얄 골드 3200CL14 (G.SKILL TridentZ Royal Gold 3200MHz CL14 8GB x2)

 - 삼성 B다이, A2 Design 10 Layers

 - 최대 4500MHz CL17-17 CR2 (VCCSA 1.22 / VCCIO 1.22 / DDR 1.5 / 9900K + Z390 Phantom ITX)

 - 최대 4700MHz CL16-16 CR2 (VCCSA 1.41 / VCCIO 1.28 / DDR 1.665 / 10900K + Z490 XII Apex)

 - 최대 4800MHz CL17-17 CR2 (VCCSA 1.55 / VCCIO 1.45 / DDR 1.595 / 9900K + Z390 XI Apex)


말이 필요없다. 최고의 메모리가 아닐까 생각한다.



4500클럭 CL17도 간단하게 먹어준다.



4700클럭 CL16 HCI 2000% 검증


여러가지 램을 구매해보고 비교해본 결과 로얄이 수율은 가장 좋았다.

그런데 발열도 로얄이 좀 더 심한 편이었다. 아마 히트싱크가 얇아서 그런것 같기도 하다.



6. 플레어 X 3200CL14 (G.SKILL Flare X 3200MHz CL14 8GB x2)

 - 삼성 B다이, A2 Design 10 Layers

 - 최대 4600MHz CL16-16 CR2 (VCCSA 1.3 / VCCIO 1.19 / DDR 1.61 / 10900K + Z490 XII APEX)




이 램은 4700부터 CL16은 안정화가 불가능하며 4600에서 최상의 퍼포먼스를 자랑한다. 

103.99달러의 메모리 치고는 매우 성능이 뛰어나다고 볼 수 있다.


7. 립죠스 V 4000CL15 (G.SKILL Ripjaws V 4000MHz CL15 8GB x2)

 - 삼성 B다이, A2 Design 10 Layers

 - 최대 4800MHz (1:1 Mode) CL17-17 CR2 (VCCSA 1.48 / VCCIO 1.28 / DDR 1.58 / 10900K + Z490 Unify ITX)


얼마 전 관세내 진입해 메모리 오버클러킹에 광풍을 몰고온 메모리이다.

기존 3200MHz CL14 메모리와 다른 점은 고수율 선별IC를 사용하기 때문에 기대수율이 높은 편이라는 점이다.

다만, 이것조차 뽑기이기 때문에 보장하지는 않는다. 총 2장을 뽑았는데 1장은 4700MHz CL17에서 안정화 되었다.


메모리 방열판이 사실 없는만도 못한 수준이어서 이 제품은 찍먹 해보고 괜찮다 싶으면 사제 방열판을 장착하는 것을 추천한다.

사제 방열판이 오히려 더 높은 오버클러킹 포텐셜을 보여준다.


7. 로얄 골드 3200CL14 (G.SKILL TridentZ Royal Gold 3200MHz CL14 8GB x2)

 - 삼성 B다이, A2 Design 10 Layers

 - 최대 4800MHz (1:1 Mode) CL16-17 CR2 (VCCSA 1.48 / VCCIO 1.26 / DDR 1.65 / 10900K + Z490 Unify ITX)


두 번째 로얄골드다.

멤컨이 받쳐줘서 그런지 4800MHz CL16까지 안정화는 별 탈 없이 가능했다. 다만 스트레이트는 불가하다.



지스킬 메모리의 PCB가 과거 8레이어였는데, 10레이어로 층수를 올리면서 조금 더 깔끔한 데이터라인을 제공하게 된 듯 싶다.

튜닝램 구매 전 고려해보고, 현명한 선택 하시기 바란다.

AlexNet (8-layer)

Top-5 error: 15.4%

이후 Layer를 쌓는 시도가 증가

VGG (19-layer)

7.3%

GoogleNet (22-layer)

6.67%


새로운 의문점...

Q. 과연 Layer를 많이 쌓는 것이 좋은 결과를 가져오는가?

A. ㄴㄴ. ResNet Depth-152짜리가 ResNet Depth-20짜리보다 CIFAR-10에 대해 에러율이 더 안좋게 나옴

    더 높은 training error를 발생시킨 꼴

    이유: backpropagation되는 gradient가 점점 약해져서 소멸되는 문제 (Gradient vanishing)


단순히 깊게 쌓는 것이 좋은게 아님. 어떻게 이러한 문제를 해결해야 되는가..?


1. 넓게 쌓는다. (추후 설명)

2. Residual Unit(일종의 지름길)을 사용한다.


ResNet (152-layer)

3.6%

Residual unit을 사용해 Layer를 쌓아서 Backpropagation 문제를 해결


Residual Unit


Residual unit의 개념을 알아차린 사람들은 이런 과감한 시도를 함.




R-CNN (Region-based CNN)


 이미지에서 region을 추출하고 CNN함


Q. Region 추출은 어떻게 하는가? bruteforce는 cost가 너무 크지 않나?

A. CNN 이전에 개발된 Segmentation을 사용해서 쪼개보자.


그래서 나온 것이 Fast R-CNN


Fast R-CNN


  RoI (Region of Interest)를 projection시켜서 convolution network에 집어넣어 버림



파레이돌리아 (Pareidolia)


  사람이 보기에도 얼핏 대상이 아니지만 비슷하게 생겼다고 느끼는 현상

이게 NN에서도 동일하게 나타남, Alt-text generator (캡션 만들어 주는 도구)가 잘못된 Caption 생성하는 경우가 있음



Becoming fully convolutional

  하나만 Convolution하는 것은 1x1의 배열을 주욱 늘어놓은 모양새




  이를 H x W의 사이즈 인풋으로 1x1이 아닌 H/32 x W/32의 크기로 Multiple output을 낼 수 있도록 모양을 변경


-> YOLOv3의 Object detection과 같은 쾌거를 낳음



Upsampling with transposed convolution

    stride 값을 더 크게 줘서 더 넓은 output을 만들 수 있음


Output feature map


  좌측 상단부터 합쳐진 값에 따라 output feature map 작성 (stride와 kernel size에 유의)

stride값은 original size를 벌려놓는 값 (1이 가장 붙어있고, 2가 한칸 떨어짐)

kernel은 읽어오는 단위


Q. 이렇게 만든 이미지의 품질은 어떤가?

A. Grid effect가 발생함 (전에 배운 Fourier transform에서 edge가 강화되는 문제)


    이는 Low frequency영역을 날려버리면 그러한 아티팩트가 제거됨

Propagation

Forward propagation


  순차적으로 Divide and conquor형식을 따라 값을 구해나감. 역산이 쉬워짐.


Chain rule


  수학 시간에 배운 내용, 미분 결과를 짬뽕해서 최종적으로 필요한 값을 구하는 방법

Backpropagation을 구하기 위해 필요함  


Backpropagation


  역으로 전파하는것, 값을 역으로 구함. (https://youtu.be/573EZkzfnZ0?t=341)



1. Forward로 계산되어 있는 값을 이용하되, 주어진 식을 미리 최종적으로 구할 x, w에 해당하는 미분방정식으로 구해놓음



2. Chain rule을 이용해 각 미분값을 구함



3. 미분값으로부터 Chain rule을 사용하면 w와 x값을 구할 수 있음


Example) Sigmoid


  이러한 Sigmoid형태는 애써서 미분할 필요가 없다.


Graph로 그려보기


가장 오른쪽 perceptron에 해당하는 1/x의 미분값만 알면 됨.

나머지는 계속 Chain rule에 의해서 계속 곱하고 곱하고 곱하고해서 사라져버림. 결국 최종적으로 dz/dg값을 구할 수 있음

(https://youtu.be/573EZkzfnZ0?t=926)




그래서 Tensorflow에서는 모든 것이 그래프로써 그려진다.



Pattern of Backward flow

ADD(+) gate

  Gradient distributor (Gradient를 분배함)


MUL(*) gate

  Gradient switcher (선택된 곳만 Update)


MAX(최대값) gate

  Gradient router (한 쪽만 반영)


Loss Function

현재의 Classifer가 주어진 Dataset에 대하여 얼마나 좋은지 나타내는 함수



예시) Linear classifier

3개의 training example, 3개의 class


이전에도 설명했듯이, f(x, W) = xW + b (b = bias, W = weight of parameters)



prob\GT    cat    car    frog

cat            3.2    1.3     2.2

car            5.1    4.9     2.5

frog         -1.7    2.0    -3.1


GT들은 각각 3.2, 4.9, -3.1이다.



Multiclass SVM Loss 구하기


각각 개별에 대한 Loss 구하는 방법

foreach true_negative in true_negatives:

  max = max(0, true_negative - GT + 1)


cat-cat의 loss는 2.9


전체에 대한 Loss 구하는 방법

  구해진 Loss들의 합에서 N을 나눈 값: Loss over Full dataset (Average)



Q. Loss가 0인 Weight값을 찾았다면, W는 유니크한 값인가?

A. Unique하지 않다. 2W도 Loss가 0이다.


Car에 대한 Loss가 0인것으로부터 생각할 수 있음


Softmax Classifier


초기에 주어진 Unnormalized log probability가


cat

cat          3.2

car          5.1

frog        -1.7


일 때, 각 probability에 exponential을 취해서 unnormalized probability를 생성


cat        e^X

cat          3.2        24.5    

car          5.1        164.0

frog        -1.7        0.18


각 e^X 값의 비중이 얼마나 차지하는지 계산하여 probability 생성


cat        e^X        probability

cat          3.2        24.5        0.13

car          5.1        164.0       0.87

frog        -1.7        0.18        0.00


실제 probability는 -log(probability)을 취함으로써 얻어짐


cat        e^X        probability        real_probabliity

cat          3.2        24.5        0.13                    0.89

car          5.1        164.0       0.87

frog        -1.7        0.18        0.00


Q. 왜 이렇게 하는가?

A. Cost function의 미분값을 convex하게 만들어주기 위해서


Softmax vs SVM


Hinge loss 를 제거하여 0-확률 문제를 제거함



Optimization

Gradient descent

  

epoch와 Learning rate에 관계에 중요한 역할을 가짐


Convex function에 최적의 값을 찾아주는 것을 보장 (Non-convex할 경우 Local minimum에 빠짐)

대부분의 vision problem이 non-convex임


Stochastic Gradient Descent

Q. Gradient descent를 적용하기에는 데이터셋이 너무 큰 경우가 존재하는데 어떻게 하는가?

A. Mini-batch를 사용해서 Gradient descent를 수행함.

    단, minibatch는 랜덤하게 뽑고, shuffle된 값이기 때문에 weight를 정해주어야 함.


Mini-batch를 수행하는 주기를 Epoch라고 함. (pytorch에서는 DataLoader 함수를 사용하고, iteration 시킴)


Learning rate를 설정하는 방법


Gradient descent oscillations

높을 수록 Curve를 잘 타서 Local minimum에서 빠져나올 수 있음.

단, 높은 LR은 변화에 민감해서 Loss의 최소값과 최대값 사이를 크게 진동하는 경향을 보임.

낮을 수록 안정적으로 수렴, Epoch에 따라서 LR을 조절해줄 필요가 있음 (점점 낮게, 보통 이니셜은 0.1에서 점차 줄임)


적절하게 LR을 조절하면, 최종적으로 Loss가 어느 정도에 수렴하게 됨 (좋은 알고리즘의 경우 Loss가 거의 0에 수렴)



How to set the Hyperparameter

1. Dataset(전체를 Training set으로 퉁침)에 맞는 hyperparameter를 찾는다 (문제: Training data에 대해서만 완벽함)

2. Dataset을 training set과 test set으로 구별하고, hyperparameter를 찾는다.

    (과제 했던 것 처럼 trainloader와 testloader를 따로 두는 방법, 문제: 새로운 데이터의 결과가 어떻게 나올지 모름)

3. dataset을 training set, validation set, test set으로 구별하고, validation set의 결과가 좋은 hyperparameter를 찾는다.

    (Training과 Validating을 분리하는 것이 중점. 이 때, Validation set은 Train에 사용될 수 없음.)

4. Dataset을 잘개 쪼개서 Fold로 만들고 각각의 Fold에 대해 Validation set으로 삼음, 3번과 동일하게 Hyperparameter를 찾는다.

    (작은 데이터셋에 유용하지만 딥러닝에서는 잘 안쓰임)


Machine Learning의 한계

  세상에 존재하는 데이터셋들을 모두 총괄하는 Learning algorithm은 존재하지 않음 (No free lunch for supervised learning)

그러나, 문제에 알맞는 특성을 통해 알고리즘을 개발하면 성능을 극적으로 끌어올릴 수 있음.


Curse of Dimensionality


  n개의 binary variable -> 시간복잡도 O(2^d)

차원이 높아질수록 위치의 가능성이 기하급수적으로 증가하게 됨


Q. 이를 어떻게 해결하는가?

A. End-to-End learning을 통해 이미지를 전처리하고, Feature extraction을 하고... classifying을 하고...



Neural Network

Perceptron


  perceptron은 wx + b의 형태로 이루어져 있음. 여기서 w는 weight, b는 bias를 뜻함.


예시) 28x28사이즈의 input image가 들어오는 경우, x는 1 x 784로 표현될 수 있음 (Binary 형태의 1차원 배열)

이 때, w는 vector의 weight이 되므로 784 x 1로 표현될 수 있음.

wx + b의 결과로 1*784 + 784*1 + b = 1 * 1 + b


How about Multiclass?

  multiclass의 경우에는 perceptron을 추가하여 구현할 수 있음.


예시) 10개의 perceptron이라면, wx + b의 w는 Matrix of weights for each pixel로 취급됨

그러므로 W = 10 * 784 (10개의 perceptron, 10-class classification)

Result of wx + b = 1*784 + 10*784 + b


Bias를 perceptron에 변수로써 추가(fake feature)해서 bias convenience를 구성할 수 있음


Composition


  이렇게 구성된 perceptron들은 Matrix를 구성하는 일부가 되며, 이를 Layer라고 부름.


Activation Function

 해당 neural network를 Activation시킬 지 정하는 함수(perceptron). Sigmoid, ReLU등이 있음.

예시) Linear classifier에 활용


Multi-Layer Perceptron (MLP)

non-linear한 activation function들이 서로 연결된 형태

Feed-forward network라고 부르기도 함


SVM(Support vector machine)과 Perceptron의 관계

  SVM은 Class별의 margin을 극대화시키는 support vector를 알아내는 것

  근데 Perceptron은 아님, perceptron과 SVM이 classifying한다는 점은 동일함.

  

Activation Function: ReLU (Rectified Linear Unit)


f(x) = max(0, x)의 형태, ReLU를 거친 데이터는 음의 값을 가질 수 없음 (음의 데이터를 가진 NN을 deactivation함)


많은 Layer가 필요한 이유


  Low level parts에서 바퀴를 검출하고, mid-level part에서는 바퀴를 포함한 프레임을 검출하는 등

High level part에서는 이 물체가 무엇인지 prediction하도록 하려면 Multiple layer가 필요하게 됨


Q. 그럼 대체 몇개가 필요한가?

A. 그것을 정하는 것이 바로 hyperparameter이다. (NN의 넓고 깊음의 최적화 필요)


Convolution Neural Network (CNN)

CNN의 간단한 비유


  여러 가지의 경우의 수를 고려하고, 최종적으로 Decision making에 반영하는 형태.

여러 가지 경우의 수 내에도 또 다른 여러가지의 경우의 수가 존재함.


NN에 이미지를 넣으면...



  매우 많은 수의 parameter가 생성됨으로써 공간의 낭비가 심함.


Q. 이를 해결하기 위해서는 어떻게 해야하는가?

A. 1. Receptive field를 이용하기 (local neighborhood만을 찾기, Local에서 global로 expansion하는 layer가 필요함)

    2. Parameter sharing을 통해서 NN내에 존재하는 perceptron들이 사용할 weight을 동일하게 함


Convolution (합성곱)


  여러개의 필터(local perceptron = kernel)를 배우고, 합성곱을 통해 필요한 데이터만을 NN에서 취급하게 함.

hyperparameter로는 stride(얼마나 shift할 것인지), kernel size(NxN kernel)등이 있음



Convolution layer output size

(N - F) / stride + 1

Pooling Layer


  Pooling은 downscaling과 비슷한 개념으로 이해하면 됨.

Pooling에는 대표적으로 Max pooling과 average pooling이 있음


Average pooling

  stride수 만큼 shift하면서 Convolution filter(kernel)크기 내에 있는 값을 평균내어 receptive field 생성

Max pooling

  stride수 만큼 shift하면서 Convlution filter(kernel)크기 내에 있는 값 중 가장 큰 값을 통해 receptive field 생성


Receptive field의 크기

filter size (K x K), Stride (S), Pool size (K)

patch size: (P+K-S) * (P+K-S)



Overfitting problem



dropout(Layer에 포함된 일부 weight중 일부만 참여시키는 것)으로 해결



Architecture for Classification


  1. Convolution -> Local contract normalization -> Max pooling

  2. Convolution + Max pooling

  3. Fully connected layers








'Photograph' 카테고리의 다른 글

say wio in tokyo  (0) 2023.08.31
봄볕  (0) 2019.04.22
아주대학교 벚꽃나들이  (1) 2019.04.13