일지/네부캠 AI 4기(22.09.19~23.02.14)

20221024

제로타이 2022. 10. 24. 22:37

알고리즘 먼데이 챌린지

import sys
input = sys.stdin.readline
from collections import deque

n, m = map(int, input().split())
lst = deque()
for _ in range(m):
	order, cost = input().split()
	if order == 'deposit': n += int(cost)
	elif order == 'pay':
		if int(cost) <= n: n -= int(cost)
	else: lst.append(int(cost))	
	while lst and n >= lst[0]:
		n -= lst[0]
		lst.popleft()
print(n)
import sys
input = sys.stdin.readline

n = int(input())
inlst = [[*map(int, input().split())] for _ in range(n)]

dx = [1,-1,0,0]
dy = [0,0,1,-1]

ans = 0
flag = True
while flag:
	flag = False
	lst = []
	for i in range(n):
		for j in range(n):
			if inlst[i][j]:
				flag = True
				count = 0
				for k in range(4):
					nx = i + dx[k]
					ny = j + dy[k]
					if -1 < nx < n and -1 < ny < n and not inlst[nx][ny]: count += 1
				lst.append((i,j,count))	
	for i,j,count in lst: inlst[i][j] = max(0, inlst[i][j]-count)
	ans += 1
print(ans-1)
n = int(input())
empty = [1 for i in range(n+1)]
left = [1 for i in range(n+1)]
right = [1 for i in range(n+1)]
mid = [1 for i in range(n+1)]
leri = [1 for i in range(n+1)]

for i in range(2, n+1):
	empty[i] = (empty[i-1] + left[i-1] + right[i-1] + mid[i-1] + leri[i-1])% 100000007
	left[i] = (empty[i-1] + right[i-1] + mid[i-1])% 100000007
	right[i] = (empty[i-1] + left[i-1] + mid[i-1])% 100000007
	mid[i] = (empty[i-1] + left[i-1] + right[i-1] + leri[i-1])% 100000007
	leri[i] = (empty[i-1] + mid[i-1])% 100000007

print((empty[n] + left[n] + right[n] + mid[n] + leri[n]) % 100000007)

마지막 문제는 문제를 이해하는 데에만 조금 시간이 걸렸다. 그리고 이해를 하고 나서도 어떻게 풀어야 할지를 몰라서 결국 포기. dp를 활용해야할 것 같지만, 규칙성을 찾지를 못 하겠으니.. 
깔끔하게 인정하고 다음 주에 해설을 보는 게 좋겠다.

n = 3
from collections import defaultdict
graph = defaultdict(list)
for i in range(n):
    s, e = map(int, input().split())
    graph[s].append(e)
    graph[e].append(s)

그래프 표현을 위해 defaultdict를 사용할 것을 권장하면서 보여준 해설 코드. 선언할 때 들어갈 자료형을 정확하게 명시해주어야만 한다. 그냥 dict형보다 코드가 훨씬 간결하다. dict형은 처음 자료형이 없을 때 추가적인 조건을 걸어줘야 하기 때문. dict형이 배열보다는 훨씬 좋은 것으로 알고 있어서 앞으로 이건 조금 참고해야겠다 싶어서 남겨둔다.

저번에 풀지 못했던 최대 사이클의 길이를 찾는 문제. 문제 해설을 보니까 주어지는 그래프 상에서 사이클은 하나밖에 나오지 않는 것으로 조건을 바꿨더라. 그럼 결국 사이클을 찾기만 하면 되는 것이라 난이도가 굉장히 쉬워진다. 
문제들이 왜 이렇게 설명이 불완전한 것 같지. 불친절하다가 아니라 정말 완전하지 못 한 느낌이다. 이게 맞나.. 아무튼 해설이 나왔으니 다시 한번 내일 도전해보는 시간을 가지는 게 좋을 것 같다. 정답 코드를 보니 확실히 어렵지는 않던데, 막상 정답 코드라길래 그걸로 제출하니 fail이 뜨는 건 대체 무슨 심보냐..?

타운홀 미팅

도메인 기초 프로젝트 

현업과 비슷한 경험을 할 수 있도록 프로세스가 짜여있다. 프로젝트 별로 모델 성능 향상을 꾀할 수 있는 강의가 제공된다. 
스페셜 미션도 제공된다. 필수사항은 아니지만, 원활한 프로젝트 진행을 위해 하는 것이 권장된다. 

프로젝트 전반적인 그라운드 룰!
일일 제출 횟수는 팀 당 하루 10번. 리더보드 제출은 신중하게 하라. 외부 대회에서도 보통 5회 제한이 걸려있다. 
토론 게시판을 통해 모델링에 대한 아이디어나 코드를 공유하라. 다만 공유는 오직 공개적으로 이뤄져야만 한다.
리더보드 상위권의 경우 코드 재현을 요구할 수 있다. 
이밖에도 프로젝트마다 상이한 세부 룰이 있으니 확인하라.

CV는 예측을 통해 사람이 마스크를 썼는지 확인. NLP는 문장 간 유사도를 측정하는 프로젝트. Recsys는 사용자의 책 평점 데이터를 바탕으로 사용자가 어떤 책을 선호할지 예측.

베이스 캠프 세팅

소통 장소

강의 내용에 대한 질문사항은 부스트코스 질문 게시판에 남겨야 조교가 답변을 해준다. 기타 여부는 대체로 슬랙에 문의하고, Aistages의 플랫폼 상에서 생기는 문제는 해당 사이트 이슈&건의 게시판에. 

AIstages 사용법에 대한 설명. 코드를 입력했음에도 내게는 대회 관련 페이지가 열리지 않아 일단 듣는 것으로만 만족해야했다.

슬기로운 부스트캠프 생활

문제 해결 과정을 통해 성장. 
중요한 것은 자율적으로 나아가면서 적극적으로 성장하는 것. 적극적이라 함은 단순히 부캠에서 제공되는 자료에만 매몰되지 말라는 것. 전문가가 되기 위해 다양한 접근을 시도하고 관점을 마련하라.
그리고 그러한 것들을 공유하면서 부캠 소통 커뮤니티를 만들라. 함께 하는 동료로서 서로를 대하라.

교육 피드백

다음 일정들.

피드백을 어떻게 활용할까? 부캠은 평가를 위한 교육 프로그램이 아니다. 성장을 위해 마련된 장소이기에, 피드백을 성장에 사용하라. 
대표적인 피드백 방법. 학습 회고 기록 제출을 통한 스스로의 피드백. 모델 개선을 위해 무엇을 했는지를 상세하게 기술해보라.
wrap-up 리포트. 프로젝트가 끝나는 주에 필수로 제출해야 함. 팀 1명이 대표로 제출하며 개인 회고도 내용에 포함되어야 함. 프로젝트 전반을 요약하되, 개인의 역할이 잘 드러나게.

동료 피드백도 프로젝트 종료일에 필수 제출. 팀원 모두가 제출해야만 함. 평가를 하는 것이 아니라 무얼 하면 좋을지 개선점과 강점을 제시해주는 것이다.

프로젝트 아이디어

사용자 데이터, 책 데이터, 평점 데이터가 주어져 있다. 직관적으로는 사용자가 즐겨 읽는 책과 비슷한 장르의 책을 추천해주면 좋을 것  같다. 책 중에는 장르나 요약정보가 비어있는 경우가 있기에 이를 채울 방법이 필요하다. 이는 유저 평점데이터를 활용할 수도 있고, 제목의 유사도를 측정할 수도 있을 것이다. 둘 다 사용하는 방법도 가능할 것으로 보인다. 
한가지. 우리는 RMSE만을 이용해 평가를 하기 때문에 시간이 오래 걸리는 것은 중요하지 않을 것 같다. 최대한 잘 평가하는 게 중요하다.


우리의 문제는 책을 추천하는 것이 아니라 유저가 책에 대해 어떤 평점을 내릴지 예측하는 문제이다.
궁극적으로 우리는 CF문제를 푸는 것. 
이를 위해서는 유저의 특징을 담는 유저 임베딩, 아이템의 특징을 담는 아이템 임베딩이 필요할 것 같다.
개인화된 추천을 해주어야만 한다.
임베딩을 할 때 아이템의 피처를 반영할 수 없지 않은가? 피처를 고려하기 위해선  ffm을 써야할까?
죄다 짬뽕해서 만들면 어떠한가? 

우리는 test_ratings.csv에서 평점을 담아 csv로 저장해 제출해야 한다.
cold start문제가 있을 수 있는가? 한번도 책을 빌리지 않은 유저나 빌려지지 않은 책이 테스트셋에 있을 수 있는가?
그렇다면 그러한 유저가 본 책의 평점은 ibcf로 하면 될 것 같다. 따로 처리하는 것. 
일단 그것을 확인하는 과정이 선행되어야 한다.
그런데 주어진 파일 중에 이미 test_ratings가 있다. 이걸 학습에 사용하지는 않을 것이지만, 이 데이터를 뜯어보는 것은 괜찮은가? cold start가 있는지 알아보고 싶다. 

책의 이미지도 가지고 있다. 전이학습을 통해 cv의 모델을 불러와서.. 뭘 하지? 분류?

평점 데이터에 1점이 가장 많다. 평점이 없는 것?

피어세션

원래 오늘은 심화과제 발표가 진행됐어야 했다. 내가 발표여서 준비를 나름 조금 했는데, 일단 당장 시작하게 된 프로젝트가 우선인지라 그것에 대해서 먼저 이야기 나누는 것이 선행되었다. 일단 다들 서버를 만들고, 그것을 어떻게 쓸 지에 대해서 이야기가 나왔는데, 나는 처음에는 간단하게 주피터 노트북으로 실행이 되니 굳이 다른 게 필요할 것이라고 생각하지는 않았다. 다만 희원 님이 주피터에서는 자동 완성 기능이 제대로 지원되지 않기에 불편하다고 하셨고 마침 이미 vscode로 ssh 원격 연결을 해내셨다고 하셔서 이를 따라하기로 했다. 
나는 WSL로 연결을 하려고 했는데, WSL에서는 chmod가 제대로 작동을 하지 않는 지라 애를 먹었다. 이를 해결하기 위해 추가적인 명령어가 필요한데 이것조차 제대로 작동을 하지 않아 그냥 git bash로 열어서 서버에 접속하는데 성공했다. 이후에 vscode로 연결하는 과정. ssh디렉에 config 파일에 key 위치를 절대경로로 입력하라는 조언을 듣고 해봤더니 정말 됐다! 나중에 찾아보니 vscode는 절대경로를 지정해주는 게 좋다고 한다. 차례차례 다들 vscode로 연결하는데 성공했고, 마지막으로 현희 님 것을 도와주면서 시간을 보냈다. 결국 다들 vscode로 프로젝트를 진행할 수 있게 되었다!
하지만 여기까지 걸린 시간이 이미 한 시간이 훌쩍 넘은지라 정말 정말 너무 너무 아쉽게도 심화과제 발표는 못 하게 됐다! 내용이 너무 어려워 완전히 이해는 하지 못 했던지라 발표할 자신이 조금 없었는데, 어쩔 수 없게도 시간 문제 상 못 하게 됐으니 정말 정말 너무 너무 아쉽다. 
그런데 NGCF의 완벽한 상위호환 버전인 LightGCN이 존재하기에 이 모델을 깊게 들어가는 것이 크게 의미는 없을 거라 생각하던 차라 안 그래도 조금 중요도가 덜하다고 생각하고 있었다.

강의 내용은 전반적으로 복습 차원의 내용이 많아서 일단 내일까지 다 들으면서 중요한 부분만 캐치하고 수요일부터 프로젝트에 집중해보기로 의견을 모았다. 그래서 내일까지 강의를 다 듣고, 그 다음부터 EDA와 모델 설계를 하게 될 것 같다. 

공부

P스테이지의 시작. 제공된 강의가 많지 않았고, 위에 생각했던 대로 시행하기 위해 오늘은 최대한 강의 듣는데 집중했다. 강의들도 새로운 내용을 가르치기보다는 어떤 관점에서 생각해볼 수 있는지, 어떤 라이브러리를 쓸 수 있는지 종류를 제시해주는 내용을 담고 있었기에 딱히 유심히 내용을 정리하면서 듣지는 않았다. 다만 나중에 필요할 때 참고할 수 있도록 간략하게 무슨 내용을 담고있는지만 정리를 해뒀다. 그래서 일단 당장은 10강을 전부 들었는데, 이걸 정말 들었다고 할 수 있을지..

회고 및 다짐

강의의 내용이 무엇인지만 파악하기 위해 스피드를 내서 들었기에 스페셜 미션도 그다지 제대로 수행하지 않았다. 아무래도 스페셜 미션을 해보면서 강의를 다시 보는 방식으로 해야할 듯 싶다. 사실 지금 당장 어떻게든 프로젝트에 손을 대고 싶다. 뭔가 데이터를 어떻게든 만지고 모델을 설계해보고 싶은 마음이 크다. 물론 내 구현실력을 내가 바라는 것을 이루기에 한참 부족하지만, 대충 멋모르니 꿈도 큰 상태인 것 같다. 지금 머리 속에는 데이터를 어떻게 하면 좋을까에 대한 고민들로 가득하다. 신경 쓸 게 생겨서 오히려 좋다. 

내일은 말했던 대로 스페셜 미션을 하면서 어떻게 하면 좋을지 알아보는 시간을 가질 것이다. 일단 지금은 내가 대충 생각해둔 것들을 데이터로 표현해보는 시간을 가져야겠다.

 

'일지 > 네부캠 AI 4기(22.09.19~23.02.14)' 카테고리의 다른 글

20221026  (2) 2022.10.26
20221025  (0) 2022.10.25
20221023  (0) 2022.10.23
20221022  (0) 2022.10.23
20221021  (2) 2022.10.21