본문 바로가기

글쓰기

[AIFFEL|나만의 글쓰기] week_3 회고

여러 가지를 배웠지만 기억에 남는 것들 위주로 기록해보려 한다.

 

  • CV lecture_04 optimizer

 CV lecture 스터디 발표 진행자분들이 설명을 깔끔하게 잘해주셨다. optimizer 부분, 수식도 많고 해서 앞부분을 제대로 알아 아야 뒤를 알 수 있어 진도 나가기 쉽지 않은 강의였다.

GD부터 SGD, Momentum, adaGrad, RMSProp, adam 등등 최적화를 위해 이전 방법에서의 문제를 해결하거나 다른 방식으로 봐서 최적화라는 목적을 달성하기 위해 바뀌어 온 것을 느꼈다. 그런 부분은 프로그래밍이랑 비슷하다 생각 든다.

 

 

  • 사람이 말하는 단어를 인공지능

 전자책 읽어주는 AI 성우를 만들고 싶기에 관심이 가는 노드였지만 

노트북에 GPU가 제대로 안 돌아가는 문제를 이때 발견하게 되어 

드라이버와 싸우느라 바쁜 시간들이었다.

디지털 신호처리 1장에 나온 부분이 조금 겹쳐서 수월할까 싶었지만 착각인걸 아는 데는 '다음' 클릭 한 두 번이면 알 수 있었다.

이전 주의 Exploration이 남았었기에 시간을 더 투자하지 않았다.

 

 

  • Coding master 

 다른 스터디도 있다는 핑계로 절반만 풀고 참여했다.

빗물 받는 문제(Leet code 42. Trapping Rain Water)는 설명을 들어도 어려웠다. 왜 스택을 써야 하는지 이해 못했다

기둥 사이로만 물을 받을 수 있다.

그렇기에 기둥이 2개 이상 이어야 하고 기둥이 서로 1칸 이상씩 떨어져 있어야 가능하다.

그래서 양쪽 사이드부터 포인터를 이동하며 기둥이 있는지 파악하고 

받을 수 있는 물의 양의 최대치로 계산하고 중간에 나오는 기둥들은 

최대치로 계산한 물의 양에서 중간에 발견하 기둥이 물에 잠겨 있는 부분만큼만 빼면 되지 않을까 했다.

하지만 여전히 고려해야 할 부분이 많다. 양쪽 사이드 포인터가 움직이는 조건은 어떻게 줄 것인가?

언제 움직이게 할 것이고 언제 안 움직이게 할 것인가?

한 개만 움직이게 할 것인가? 양쪽 다 동시에 쭉 움직일 것인가?

아니면 애초에 문제 접근이 잘못되었는가 생각하게 된다.

그래서 쉽지 않았다.

 기둥이 2개 이상, 간격 1 이상이라는 조건이 문제가 풀리기 위한 최소 조건에 만족한다 생각하는데

그 조건을 만족하면서 받는 물의 양을 효율적으로 계산하는 방법은 잘 떠오르지 않았다.

좀 더 잼 보드에 그려보거나 종이에 적어봐야 알 수 있을 거 같다.

백준 팁으로는 2시간 고민해도 안되면 풀이를 참고하라 하는데 좀 애매하다.

풀이 참고해도 내 거가 안될 때가 있고 풀이 없이 시간을 쏟아부어서 억지로 풀 수도 있지만 역시 시간 지나면 기억에 남지 않고

비효율적인 코드가 되기 쉽기에 나중에 써먹기 어렵다.

 

풀이를 보거나 안 보거나 2가지 밖에 없기에 

정 안 풀리면 풀이를 참고하고 손 코딩 진행 및 하루, 이틀, 일주일 뒤에 다시 풀 수 있나 테스트해봐야겠다.

 

 

  • 사이킷런으로 구현해보는 머신러닝 

 첫 노드에서부터 사이킷런을 사용했고 꾸준히 썼었기에 이 노드 시작할 때

지금 배우는 게 얼마나 의미가 있을까 하고 의구심이 들었다.

하지만 혼자였다면 굳이 안 알아봤을 거 같은 사이킷런에 대한 부분들(이름유래) ,ETL(Extract Transform Load) 과 관련하여 사이킷런 메서드의 동작을 설명하는 부분은 다 이해한 건 아니지만 유익했다.

 

 

  • 밑바닥부터 시작하는 딥러닝 스터디

평일 저녁 1시간씩 밑바닥부터 딥러닝 스터디를 나간다. 내가 진행하는 부분은 초반 퍼셉트론 부분이라 앞으로 나올 내용과 비교해서 상대적으로 많이 수월한 편이었다. 물론 정리하는 과정은 수월하지 않았다. 내가 진행할 때 주로 혼자 설명하는 식이라 금방 끝나고 스터디의 의미가 좀 퇴색되었지만 이후 진행자분들은 질문을 많이 해주셔서 좀 더 이해를 깊게 하는데 도움되었다. 확실히 미리 공부하고 스터디를 하는 게 더 깊게 배울 수 있어 좋고, 다른 분의 관점에서 나는 생각지 못한 부분을 생각해보게 되어 좋다. 바쁘다는 핑계로 코드 따라 쳐 본 게 초반 부분밖에 없지만 정말 밑바닥부터 만들기 위해 매일 조금씩, 그리고 주말에 확실히 배웠던 부분, 배울 부분 코딩하며 실습하겠다.

 

  • 영화 리뷰 분석

자연어 관련 첫 노드였다. 참고하는 읽을거리에 나온 동아일보 기사가 인상 깊어 그거만 읽는데 시간을 꽤 쏟았었다.

NPL란 무엇인가, 어떤 과정으로 이루어지는가, 어떤 기술들이 사용되어왔고 지금은 사용되는지 그 과정들과 이유에 대해 더 궁금하게 된다.

너무 부족한 이해로 노드 내용을 붙여 넣고 결과물에 맞게 조금씩 수정하는 느낌이라 밑 딥 2에 나온 기초 내용과 구글링으로 조금 참고했다.

word2 vec 추론을 기반을 한다는 것, 단어 간 유사도를 반영할 수 있도록 단어의 의미를 벡터화할 수 있는 방법이라는 것 정도와

통계기반으로는 시소러스가 있었으며 word2 vec, transformer, BERT 등 등 팔려면 팔게 많아서 조금은 부담도 되고 알아가는 재미가 있는 부분이다. 

이 Exploration을 하면서 나름 이해를 하고 하려 했지만 하다 보니 앞에 닥친 문제 풀기에 급급해졌던 거 같다.

이미 다 해결한 팀원이 지금 했던 Exploration이 정확히 무엇을 하는 건지 그리고 메서드 관련하여 좀 더 깊이 들어가서 질문했을 때 나는 해보지 않았던, 못했던 생각이라 분명 짚고 넘어갈만한 부분인데도 난 그런 고민 없이 진행했었구나 싶어 내가 했던걸 되돌아보게 되었다.당장 과제를 해결하는 것도 중요하겠지만 전체 흐름이 어떻게 되는지, 각 메서드는 어떤 역할을 하는지, 어디에 써먹을 건지에 대해 고민과 확실히 짚고 너무 가는 게 더 필요하다 생각 든다.

 


 

  • CSAPP스터디

Ch3.1 ~3.4.1까지 나갔다. 목표는 3.8이었지만 2시간 동안 진도 나가기 빠듯하였다. 바쁘다는 핑계로 공동으로 정리하는 notion에 나 스스로 정리가 없었다. 그랬던 부분이 수월하게 진도 나가는데 좀 더 더디게 되지 않았나 생각한다.

이 책은 은근히 재밌다. 훑어볼 때는 이렇구나 싶은데 막상 천천히 씹으면서 읽어보면 이게 뭔가 싶은 부분이 계속 나온다.

이해했다 생각했는데 뒷 장에 비슷한 내용으로 다르게 나오면 어? 뭐야 다르네 싶고 쉽지 않은 책이다. lab 까지 해야 확실히 배우는 의미가 있는 책인데 곱씹어 읽기도 바쁜 상황이다.

 기계 수준 프로그램의 형식과 동작은 인스트럭션 집합 구조(ISA_Instruction Set Arichtecture), ISA에 의해 정의되고

ISA는 프로세서의 상태, 상태, 인스트럭션의 형식, 프로세서 상태에 대한 각 인스트럭션들의 영향들은 정의한다는데

ISA는 어디에 저장되어 있는지, 인스트럭션의 형식은 무엇인지, 상태에 대한 각 인스트럭션들의 영향은 무엇인지 읽어봐도 어렵고 깊은 설명이 없을 때도 있다. 자꾸 떡밥처럼 앞에 나오고 뒤에 설명되기도 한다.

 프로세서는 CPU라고 생각했지만 책을 읽어보니 프로세서와 CPU를 구분한다. 알았던 거 같은데 또 다를 때의 허무함이 있다.

그래도 같이 돌아가면서 읽으면서 이해 안 되는 부분 말하고 아는 사람 있으면 설명해주고 다 같이 모르면 좀 찾아보고서 유추하거나 답을 찾아가서 혼자 공부할 때보다는 의미 있다.

 

  • PS 스터디

절반가량 풀어갔다. 

BOJ

#계단 오르기 2579

계단에 점수가 있으며 밟은 계단에 있는 점수들의 총합이 가장 큰 경우를 return 한다.

- 한 번에 앞으로 최대 2칸까지

- 연속으로 2계단까지만 밟을 수 있다.

- 마지막 계단은 꼭 밟아야 한다.

마지막은 꼭 밟아야 하므로 계단 내려가기로 바꿔 생각했다. 꼭대기에서 시작하고 위에 2가지 조건을 만족하는지 확인해서 

가중치가 더 큰 계단을 밟고 그 값을 더해가는 방식이면 될 거라 생각했다.

그런데 중간에 중복되는 부분과

마지막에 0,1 인덱스의 계단을 밟을 때 혹시 2번을 밟았는지, 0번을 밟을 차례라면 1번을 밟았었는지 확인해야 하는 부분에서 그 부분만 별도로 메모를 해야 할지 전체적으로 메모를 해야 할지, 점화식을 통해 증가시키는 부분에서 어떻게 해야 할지 효율적 일지 떠오르지 않아 다른 이의 방법을 참고했다.

 

#트리 순회 1991

이진트리 데이터가 주어졌을 때 전위, 중위, 후위 순회하는 방식이었다.

node, binary tree 클래스를 만들어서 입력 값들을 노드로 찍어낸 뒤 이후에 순회하는 방식을 썼다. 

다른 사람의 방법도 대체로 비슷하였고, 다만 C++과 파이썬의 차이가 꽤 크다 느꼈다.

C++ 쓰는 분들은 파이썬 순회시키는 부분에서

preorder(), inorder(), postorder() 이렇게만 시키고 별다른 조치 없는 거에 이렇게 짧게 끝나냐는 거 봐서는 확실히 파이썬이 쓰기 편하다.

 

#직사각형으로 나누기 1451

직사각형 3 등분하고 각 부분의 총합을 서로 곱한다. 그렇게 해서 구하는 값이 최대가 되게 한다.

x * y * z = max

이 문제도 Dp였다. 문제는 풀지 않았지만 생각해본 접근방법은 

우선 사각형을 가급적 균등하게 3등분 한 다음에 점점 비 균등하게 분할해서 구한 값들을 구해서 

그 값들을 저장하면 되지 않을까 했는데 

생각해보니까 굳이 균등하게 나눌 필요가 없는 거 같다. 

최댓값이 무엇인지 알기 위해서는 모든 3 등분한 경우에서의 연산을 알아야 한다 생각한다.

그러면 계산하기 쉽게 한 사각형은 변의 길이가 1일 때부터 시작해서 최대가 될 때까지로 분할해서 각 경우의 값을 저장하고

각 사각형 별로 내부에 적힌 숫자를 별도의 저장공간(dict)에 저장해서 이미 계산한 경우는 굳이 반복해서 계산하지 않도록 한다.

DP는 부분 구조를 찾고, 중복을 제거하고, 재귀문의 경우 base case가 있어야하며 base case에 도달할 수 있어야 한다

근데 최적의 부분구조를 찾는 게 참 어렵다. 어떨 때는 문제 분류에 DP로 되어있지만 이게  왜 DP문제인가 싶으면서 문제가 이해 안 될 때도 있다,

 

#30  10610

주어진 숫자열을 가지고 30의 배수로 만들 수 있는 최댓값을 return 한다.

숫자열 1의 자릿수를 제일 큰 자릿수로 만들 수도 있고 그렇기에 그중에 30의 배수가 되는지 된다면 최댓값을 출력하게 하는 문제였다.

우선 30의 배수 일려면 0이 있어야 하니까 0이 있는지 확인하고 0이 없으면 0을 출력시켰다(30의 배수가 없으므로)

0이 1개라도 있다면 경우의 수를 찾기 전에 0을 1개 제거하고 

3의 배수인지, 3의 배수라면 이전까지 구한 최댓값보다 큰지 확인하게 해서 처리되게 만들었다.

경우의 수는 순열로 만들었다.

순열이라서 시간 초과로 중간에 터졌다.

다시 문제 분류를 보니 sort로 되어있다.

시간 초과에서 더 나아가지 않았었지만 힌트를 고려해보면 내림차순으로 만든 다음에 

최댓값인 순열조합부터 그다음으로 작은 순열조합으로 1단계씩 내려가면서 30의 배수인지(나의 방식에서는 0을 1개 이미 뺏기 때문에 3의 배수인지) 확인해서 30의 배수이면 출력해주면 될 거 같다.

 

#별 찍기 - 11 2448

문제 출력 결과물에 나오는 대로 재귀적인 구조로 반복되는 별 모양 트리를 찍어야 한다.

구조 찾는데 시간이 오래 걸릴 걸로 예상되어 진행하지 않았다.

이전에 비슷한 문제 중에 분할 정복으로 푸는 문제부터 진행하고서 도전하는 게 좀 더 수월할 거라 생각 든다.

 

#1, 2, 3 더하기 9095

11보다 작은 양수 n이 주어졌을 때 1,2,3을 몇 개가 되었든 더해서 구할 수 있는 모든 경우의 수를 return 한다.

역시 DP 문제로 부분을 찾고, 재귀가 되었든 bottom up이 되었든 중복을 제거하면서 문제를 풀어나가야 한다.

 

DP문제는 풀어도 풀어도 어렵다. 문제마다 점화식이 새롭게 느껴진다. 그냥 DP전문 책을 살까 싶은 마음도 든다. 

다른 사람 의견으로는 안되면 여러 유형의 점화식을 익힌다는 마음으로 푼다고 하는데 뭔가 답을 외워서 하는 기분이라 조금은 꺼려지지만 생각해보면 수학 공부도 비슷 방식이었다. 예제로 문제 풀이 방식을 외우고 새로운 문제에 적용하는 거였다 생각한다. 

처음부터 다른 이의 풀이법을 참고하지 않고 점화식을 세워서 풀면 좋겠지만 안되면 수학 문제라고 생각하고 익혀나가 봐야겠다.

 

 

  • CS스터디

이번 주말에 내가 맡은 부분은 이진 탐색 트리(BST)이다. 아직 정리까지는 안 했지만 그래도 따로 봐 두었기에 좀 더 수월하지 않을까 한다.

 데이터를 꺼내오는 연산이 많이 쓰이고 많이 쓰이기에 그만큼 중요하고 탐색하는데 시간이 많이 들면 그게 다 비용이기에 최대한 줄여야 한다. 데이터를 그냥 선형 자료구조에 넣으면 삽입할 때는 편리하지만 꺼내 쓸 때 불편하다. 배열이었다면 초기에 메모리에 미리 공간을 잡아두어야 하고 대신 정렬한 상태에서의 쓸 수 있는 이진 탐색 O(log n)이라 유리하다 , 연결 리스트라면 미리 잡아둘 필요는 없지만 어디에 있는지 확인할 때 최악의 경우 저장해놓은 모든 데이터를 찾아봐야 할 수 있다. O(n)

 

 데이터를 삽입하는 것과 데이터를 탐색하는 작업 모두 고려해야 하기에 여러 고민들이 나왔다. 그중에 하나가 이진 탐색 트리이다.

이진트리(자식 노드의 개수가 최대 2개)로 구성하며

입력받는 값부모노드보다 작으면 왼쪽에,  크면 오른쪽에 추가한다. 

그런 구조라서 검색할 때도 이 방식을 이용해서 검색할 수 있고, 선형 탐색보다 빠를 수 있다 균형 이진트리의 경우 O(log n).

단, 트리가 불균형하고 특히 경사 이진트리(루트보다 큰 값만 계속 있거나 작은 값 위주로 쭉 있는 경우)이면 일반 선형 자료구조에서처럼 탐색에 관해 O(n)의 시간 복잡도가 요구된다.

 

그래서 검색을 효율적으로 할 수 있도록 균형을 잡게 만드는 AVL,  이진 검색 트리를 향상한 B, B+, B- 그 외 기타 등등 여러 구조가 존재한다. 

결론은 효율적으로 검색할 수 있는 구조이다. 가성비가 중요하다.

내가 소비자 입장에서도 검색 오래 걸리면 그 서비스를 안을 가능성이 높고 쓰더라도 답답하다(도서관 사이트 검색)

그래서 더 데이터를 쉽게 저장하고 꺼낼 쓸 수 있는 구조에 대한 고민이 있는 거라 생각한다.

 

 

  • 핸즈온 머신러닝

수요일쯤에 배송 왔다. 좋다고 좋다고 하던데 읽어보니 정말 좋았다. 깔끔하게 여러 개념이 정리되어있다.

특히 2장이 좋았다(읽은 부분이 몇 챕터 안되어서 더 그렇다)

1. 큰 그림 보기

2. 데이터 구하기

3. 데이터로부터 통찰 얻기 위해 탐색하고 시각화

4. 머신러닝 알고리즘을 위해 데이터를 준비

5. 모델을 선택하고 훈련

6. 모델을 상세하게 조정

7. 설루션을 제시

8. 시스템을 론칭하고 모니터링하고 유지보수

 

이런 과정을 설명한다. 지금 나는 4~6 정도 하고 있는 거 같다.  4번 항목도 데이터를 준비한 거는 없고 다운로드하기에 사실상 5~6밖에 안 하고 있다.

하다 보니 5~6 하는 거에 익숙해졌었는데 좀 더 넓은 시야에서 보게 만들어주는 점, 시스템 론칭하고 모니터링 및 유지보수까지 들어가는 게 내가 왜 AI를 배우려고 했었는지 다시 떠올리게 한다. 

지금까지 노드 진행을 스스로  앵무새처럼 하려고 했었다. 데이터 가져오고(그것도 전 처리된 거) 모델 돌리고, 정확도 높이고 끝

이거만 반복하고 코드도 따라 쳐 볼 때도 있지만 길면 주로 복사하고 붙여 넣고 대략적인 흐름이 이렇구나 하고 넘어가기 바빴다.

그렇게만 생각했었는데 이걸 배우는 게 실제 서비스에 쓰기 위함이란 걸 다시 생각했고 떠먹여 주는 노드만 할게 아니라 만들고 싶은 거를 부분별로 쪼개서 따로 진행해봐야겠다 생각 들었다.

적어도 캐글 타이타닉부터 시작해야겠다. 그것도 데이터가 이미 있어서 수월하지만 어떤 식으로 돌리면 되는지 알려주는 노드보다 좀 더 기존에 배웠던걸 테스트해보기 좋을 거 같다.

그 외에 어렴풋하던 개념을 친절하게 설명해주어서 이해하기 좋다. 옆에 끼고 하나씩 익혀볼 맘이 든다.

 

 

지난 회고에 수학도 꾸준히 하겠다 다짐했지만 꾸준히 보기는 했지만 정말 조금씩 봤다.

수학 공부를 비타민 먹는 거에 비유한 사람이 있었는데 난 비타민 한 알씩 먹은 게 아니라 그 한 알은 가루로 쪼개서 조금씩 넣었던 거 같다.

생각해보면 ML 배울 내용이 많다. 이미 배워오던 사람도 많고 수학, 영어에 기초 있는 분들도 많다.

갑자기 따라가려면 당연히 무리일 수밖에 없다. 이왕 이렇게 된 거 노드 하는데만 시간을 쏟아붓는 게 아니라

조금은 느리더라도 기초가 되는 수학 꾸준히 1시간씩은 해야겠다.

 

한 주를 전체적으로 돌아보면 나름 한다고는 했는데 한 거만큼 남았는지는 모르는 한 주이다

그래도 거름이라도 되어서 다음 한 주, 그 이후에 도움이 되었으면 한다.

 

 

 

 

 

'글쓰기' 카테고리의 다른 글

기록 26JUN_02JUL21  (0) 2021.07.03
[AIFFEL|나만의 글쓰기] week_4 회고  (0) 2021.01.29
[AIFFEL|나만의 글쓰기] week_1 회고  (0) 2021.01.08
Aiffel을 시작하며  (4) 2020.12.31
첫 글  (0) 2020.09.01