File size: 3,444 Bytes
a1ab131
b004d07
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
a1ab131
b004d07
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
---
language: 
- ja
license: cc-by-sa-4.0
tags:
- zero-shot-classification
- text-classification
- nli
- pytorch
metrics:
- accuracy
datasets:
- JSNLI
pipeline_tag: text-classification
widget:
- text: "あなた が 好きです 。   あなた を 愛して い ます 。"
model-index:
- name: roberta-base-japanese-jsnli
  results:
  - task:
      type: text-classification
      name: Natural Language Inference
    dataset:
      type: snli
      name: JSNLI 
      split: dev
    metrics:
      - type: accuracy
        value: 0.9328
        verified: false
---
# roberta-base-japanese-jsnli

This model is a fine-tuned version of [nlp-waseda/roberta-base-japanese](https://huggingface.co/nlp-waseda/roberta-base-japanese) on the [JSNLI](https://nlp.ist.i.kyoto-u.ac.jp/?%E6%97%A5%E6%9C%AC%E8%AA%9ESNLI%28JSNLI%29%E3%83%87%E3%83%BC%E3%82%BF%E3%82%BB%E3%83%83%E3%83%88) dataset.
It achieves the following results on the evaluation set:
- Loss: 0.2039
- Accuracy: 0.9328

### How to use the model

The input text should be segmented into words by [Juman++](https://github.com/ku-nlp/jumanpp) in advance.

#### Simple zero-shot classification pipeline
```python
from transformers import pipeline
from pyknp import Juman

juman = Juman()

classifier = pipeline("zero-shot-classification", model="Formzu/roberta-base-japanese-jsnli")

sequence_to_classify = " ".join([tok.midasi for tok in juman.analysis("いつか世界を見る。").mrph_list()])

candidate_labels = ['旅行', '料理', '踊り']
out = classifier(sequence_to_classify, candidate_labels, hypothesis_template="この 例 は {} です 。")
print(out)
#{'sequence': 'いつか 世界 を 見る 。', 
# 'labels': ['旅行', '踊り', '料理'], 
# 'scores': [0.8998081684112549, 0.06059670448303223, 0.03959512338042259]}
```
#### NLI use-case
```python
from transformers import AutoTokenizer, AutoModelForSequenceClassification
import torch
from pyknp import Juman

juman = Juman()

device = torch.device("cuda") if torch.cuda.is_available() else torch.device("cpu")

model_name = "Formzu/roberta-base-japanese-jsnli"
model = AutoModelForSequenceClassification.from_pretrained(model_name).to(device)
tokenizer = AutoTokenizer.from_pretrained(model_name)

premise = " ".join([tok.midasi for tok in juman.analysis("いつか世界を見る。").mrph_list()])
label = '旅行'
hypothesis = f'この 例 は {label} です 。'

input = tokenizer.encode(premise, hypothesis, return_tensors='pt').to(device)
with torch.no_grad():
    logits = model(input)["logits"][0]
    probs = logits.softmax(dim=-1)
    print(probs.cpu().numpy(), logits.cpu().numpy())
#[0.82168734 0.1744363  0.00387629] [ 2.3362164   0.78641605 -3.0202653 ]
```
## Training procedure

### Training hyperparameters

The following hyperparameters were used during training:
- learning_rate: 2e-05
- train_batch_size: 32
- eval_batch_size: 32
- seed: 42
- optimizer: Adam with betas=(0.9,0.999) and epsilon=1e-08
- lr_scheduler_type: linear
- num_epochs: 3.0

### Training results

| Training Loss | Epoch | Step  | Validation Loss | Accuracy |
|:-------------:|:-----:|:-----:|:---------------:|:--------:|
| 0.4067        | 1.0   | 16657 | 0.2224          | 0.9201   |
| 0.3397        | 2.0   | 33314 | 0.2152          | 0.9208   |
| 0.2775        | 3.0   | 49971 | 0.2039          | 0.9328   |


### Framework versions

- Transformers 4.21.2
- Pytorch 1.12.1+cu116
- Datasets 2.4.0
- Tokenizers 0.12.1