Uploading trained models
출처: 문서
본문
학습된 모델 업로드하기
모델 학습은 Learning to Rank 플러그인 외부에서 이루어지지만, 피처 점수 로깅에는 이 플러그인을 사용할 수 있어요. 모델을 학습한 후에는 RankLib, XGBoost 같은 사용 가능한 직렬화 형식으로 플러그인에 업로드할 수 있어요.
RankLib 모델 학습
피처 로깅 과정은 RankLib에서 소비할 수 있는 judgment 파일을 생성해요. 다음 judgment 파일에서는 ID가 1인 rambo 쿼리에 문서 집합에 대해 로깅된 피처 1(제목 TF*IDF 점수)과 2(설명 TF*IDF 점수)가 포함되어 있어요:
4 qid:1 1:9.8376875 2:12.318446 # 7555 rambo
3 qid:1 1:10.7808075 2:9.510193 # 1370 rambo
3 qid:1 1:10.7808075 2:6.8449354 # 1369 rambo
3 qid:1 1:10.7808075 2:0.0 # 1368 rambo
RankLib 라이브러리는 다음 명령어로 호출할 수 있어요:
cmd = "java -jar RankLib-2.8.jar -ranker %s -train%rs -save %s -frate 1.0" % (whichModel, judgmentsWithFeaturesFile, modelOutput)
judgmentsWithFeatureFile은 학습을 위해 RankLib에 제공되는 입력이에요. 추가 파라미터를 전달할 수도 있어요. 자세한 내용은 RankLib 문서를 참고하세요.
RankLib은 자체 직렬화 형식으로 모델을 출력해요. 다음 예시에서 볼 수 있듯이 LambdaMART 모델은 회귀 트리의 앙상블이에요:
## LambdaMART
## No. of trees = 1000
## No. of leaves = 10
## No. of threshold candidates = 256
## Learning rate = 0.1
## Stop early = 100
<ensemble>
<tree id="1" weight="0.1">
<split>
<feature> 2 </feature>
...
RankLib 모델 내부에서 앙상블의 각 트리는 피처 값을 검사하고, 이 피처 값을 기반으로 의사결정을 내린 후 관련성 점수를 출력해요. 피처는 1부터 시작하는 순서 위치로 참조되며, 이는 원래 피처 집합에서의 0번째 피처에 해당해요. RankLib은 모델 학습 중에 피처 이름을 사용하지 않아요.
기타 RankLib 모델
RankLib은 LambdaMART 외에도 MART, RankNet, RankBoost, AdaRank, Coordinate Ascent, ListNet, Random Forests 같은 여러 다른 모델 유형을 구현한 라이브러리예요. 이 모델들 각각은 고유한 파라미터 집합과 학습 과정을 가지고 있어요.
예를 들어 RankNet 모델은 한 문서가 다른 문서보다 더 관련성이 높을 확률을 예측하도록 학습하는 신경망이에요. 이 모델은 두 문서의 예측된 관련성과 실제 관련성을 비교하는 pairwise 손실 함수를 사용해 학습돼요. 모델은 다음 예시와 유사한 형식으로 직렬화돼요:
## RankNet
## Epochs = 100
## No. of features = 5
## No. of hidden layers = 1
...
## Layer 1: 10 neurons
1 2
1
10
0 0 -0.013491530393429608 0.031183180961270988 0.06558792020112071 -0.006024092627087733 0.05729619574181734 -0.0017010373987742411 0.07684848696852313 -0.06570387602230028 0.04390491141617467 0.013371636736099578
...
모델이 RankLib 형식으로 직렬화되어 있다면 이 모든 모델을 Learning to Rank 플러그인과 함께 사용할 수 있어요.
XGBoost 모델 학습
RankLib 모델과 달리 XGBoost 모델은 다음 예시에서 볼 수 있듯이 gradient-boosted decision tree에 특화된 형식으로 직렬화돼요:
[ { "nodeid": 0, "depth": 0, "split": "tmdb_multi", "split_condition": 11.2009, "yes": 1, "no": 2, "missing": 1, "children": [
{ "nodeid": 1, "depth": 1, "split": "tmdb_title", "split_condition": 2.20631, "yes": 3, "no": 4, "missing": 3, "children": [
{ "nodeid": 3, "leaf": -0.03125 },
...
XGBoost 파라미터
XGBoost 모델에는 선택적 파라미터를 지정할 수 있어요. 이 파라미터들은 객체로 지정되며, decision tree는 splits 필드에 지정돼요. 지원되는 파라미터에는 XGBoost 문서에서 설명하는 대로 모델 학습 목표를 정의하는 objective가 있어요. 이 파라미터는 최종 모델 예측을 변환할 수 있어요. 지원되는 값으로는 binary:logistic, binary:logitraw, rank:ndcg, rank:map, rank:pairwise, reg:linear, reg:logistic이 있어요.
단순 선형 모델
서포트 벡터 머신(SVM) 같은 머신러닝(ML) 모델은 각 피처에 대한 선형 가중치를 출력해요. LTR 모델은 SVM이나 선형 회귀 모델에서 학습된 것 같은 이러한 선형 가중치를 단순한 형식으로 표현하는 것을 지원해요. 다음 예시 출력에서 가중치는 모델 예측에서 피처들의 상대적 중요도를 나타내요:
{
"title_query" : 0.3,
"body_query" : 0.5,
"recency" : 0.1
}
피처 정규화
피처 정규화는 피처 값을 일관된 범위, 보통 0과 1 사이 또는 -1과 1 사이로 변환하는 데 사용돼요. 이는 각 피처의 상대적 영향을 더 잘 이해하기 위해 학습 단계에서 수행돼요. SVMRank 같은 선형 모델을 포함한 일부 모델은 올바르게 동작하기 위해 정규화에 의존해요.
모델 업로드 과정
모델을 학습한 후 다음 단계는 검색 작업에 사용할 수 있도록 만드는 거예요. 이는 모델을 Learning to Rank 플러그인에 업로드하는 것을 포함해요. 모델을 업로드할 때는 다음 정보를 제공해야 해요:
- 학습 중에 사용된 피처 집합
- 모델 유형, 예를 들어 RankLib 또는 XGBoost
- 모델 내용
다음 예시 요청은 more_movie_features 피처 집합을 사용해 학습된 RankLib 모델을 업로드하는 방법을 보여줘요:
POST _ltr/_featureset/more_movie_features/_createmodel
{
"model": {
"name": "my_ranklib_model",
"model": {
"type": "model/ranklib",
"definition": "## LambdaMART\n
## No. of trees = 1000
## No. of leaves = 10
## No. of threshold candidates = 256
## Learning rate = 0.1
## Stop early = 100
<ensemble>
<tree id="1" weight="0.1">
<split>
<feature> 2 </feature>
...
"
}
}
}
다음 예시 요청은 more_movie_features 피처 집합을 사용해 학습된 XGBoost 모델을 업로드하는 방법을 보여줘요:
POST _ltr/_featureset/more_movie_features/_createmodel
{
"model": {
"name": "my_xgboost_model",
"model": {
"type": "model/xgboost+json",
"definition": "[ { \"nodeid\": 0, \"depth\": 0, \"split\": \"tmdb_multi\", \"split_condition\": 11.2009, \"yes\": 1, \"no\": 2, \"missing\": 1, \"children\": [
{ \"nodeid\": 1, \"depth\": 1, \"split\": \"tmdb_title\", \"split_condition\": 2.20631, \"yes\": 3, \"no\": 4, \"missing\": 3, \"children\": [
{ \"nodeid\": 3, \"leaf\": -0.03125 },
..."
}
}
}
다음 예시 요청은 파라미터와 함께 more_movie_features 피처 집합을 사용해 학습된 XGBoost 모델을 업로드하는 방법을 보여줘요:
POST _ltr/_featureset/more_movie_features/_createmodel
{
"model": {
"name": "my_xgboost_model",
"model": {
"type": "model/xgboost+json",
"definition": "{
\"objective\": \"reg:logistic\",
\"splits\": [ { \"nodeid\": 0, \"depth\": 0, \"split\": \"tmdb_multi\", \"split_condition\": 11.2009, \"yes\": 1, \"no\": 2, \"missing\": 1, \"children\": [
{ \"nodeid\": 1, \"depth\": 1, \"split\": \"tmdb_title\", \"split_condition\": 2.20631, \"yes\": 3, \"no\": 4, \"missing\": 3, \"children\": [
{ \"nodeid\": 3, \"leaf\": -0.03125 },
...
]
}"
}
}
}
다음 예시 요청은 more_movie_features 피처 집합을 사용해 학습된 단순 선형 모델을 업로드하는 방법을 보여줘요:
POST _ltr/_featureset/more_movie_features/_createmodel
{
"model": {
"name": "my_linear_model",
"model": {
"type": "model/linear",
"definition": """
{
"title_query" : 0.3,
"body_query" : 0.5,
"recency" : 0.1
}
"""
}
}
}
피처 정규화를 적용한 모델 생성
피처 정규화는 모델 평가 전에 적용할 수 있는 중요한 전처리 단계예요. LTR은 min-max와 standard 정규화라는 두 가지 유형의 피처 정규화를 지원해요.
Standard 정규화
Standard 정규화는 다음과 같이 피처를 변환해요:
- 평균 값을 0으로 매핑해요
- 평균보다 표준편차 1 위의 값을 1로 매핑해요
- 평균보다 표준편차 1 아래의 값을 -1로 매핑해요
다음 예시 요청은 standard 피처 정규화를 적용한 모델을 생성하는 방법을 보여줘요:
POST _ltr/_featureset/more_movie_features/_createmodel
{
"model": {
"name": "my_linear_model",
"model": {
"type": "model/linear",
"feature_normalizers": {
"release_year": {
"standard": {
"mean": 1970,
"standard_deviation": 30
}
}
},
"definition": """
{
"release_year" : 0.3,
"body_query" : 0.5,
"recency" : 0.1
}
"""
}
}
}
Min-max 정규화
Min-max 정규화는 피처를 고정된 범위, 보통 0과 1 사이로 스케일링해요. Min-max 정규화는 다음과 같이 피처를 변환해요:
- 지정된 최솟값을 0으로 매핑해요
- 지정된 최댓값을 1로 매핑해요
- 0과 1 사이의 값은 선형적으로 스케일링해요
다음 예시 요청은 min-max 정규화를 구현하는 방법을 보여줘요:
"feature_normalizers": {
"vote_average": {
"min_max": {
"minimum": 0,
"maximum": 10
}
}
}
피처 집합으로부터의 모델 독립성
모델은 처음에 피처 집합을 참조하여 생성돼요. 생성 후에는 독립적인 최상위 엔티티로 존재해요.
모델 접근하기
모델을 조회하려면 GET 요청을 사용해요:
GET _ltr/_model/my_linear_model
모델을 삭제하려면 DELETE 요청을 사용해요:
DELETE _ltr/_model/my_linear_model
모델 이름은 모든 피처 집합에서 전역적으로 고유해야 해요. {: .note}
모델 영속성
모델이 생성될 때 그 피처들이 복사돼요. 이를 통해 원본 피처에 대한 변경이 기존 모델이나 모델 운영에 영향을 주지 않도록 방지해요. 예를 들어 모델을 생성하는 데 사용된 피처 집합이 삭제되더라도 여전히 모델에 접근하고 사용할 수 있어요.
모델 응답
모델을 조회하면 다음 예시에서 볼 수 있듯이 모델을 생성하는 데 사용된 피처가 포함된 응답을 받아요:
{
"_index": ".ltrstore",
"_type": "store",
"_id": "model-my_linear_model",
"_version": 1,
"found": true,
"_source": {
"name": "my_linear_model",
"type": "model",
"model": {
"name": "my_linear_model",
"feature_set": {
"name": "more_movie_features",
"features": [
{
"name": "body_query",
"params": [
"keywords"
],
"template": {
"match": {
"overview": "{{keywords}}"
}
}
},
{
"name": "title_query",
"params": [
"keywords"
],
"template": {
"match": {
"title": "{{keywords}}"
}
}
}
]}}}
다음 단계
LTR로 검색하기에 대해 알아보세요.